首页
在线工具
搜索
1
Kuboard与KubeSphere的区别:Kubernetes管理平台对比
2
ShardingSphere使用中的重点问题剖析
3
Flowable工作流引擎源码深度解析
4
用AI生成的原型设计稿效果还可以
5
如何将Virtualbox和VMware虚拟机相互转换
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
Search
标签搜索
Angular
Docker
Phabricator
SpringBoot
Java
Chrome
SpringSecurity
SpringCloud
DDD
Git
Mac
K8S
Kubernetes
ESLint
SSH
高并发
Eclipse
Javascript
Vim
Centos
Jonathan
累计撰写
86
篇文章
累计收到
0
条评论
首页
栏目
杂谈与随笔
工具与效率
源码阅读
技术管理
运维
数据库
前端开发
后端开发
页面
搜索到
4
篇与
的结果
2020-02-02
ShardingSphere使用中的重点问题剖析
ShardingSphere使用中的重点问题剖析 一、引言 ShardingSphere是一款强大的分布式数据库中间件,在助力应用实现数据分片、读写分离等功能方面表现卓越。然而,在实际应用过程中,会遇到一些关键问题。本文将结合思维导图,深入探讨ShardingSphere在读写分离和事务处理方面的重点问题及应对策略。 二、读写分离相关问题 (一)数据库主从同步延迟问题 在读写分离架构下,主库负责写入操作,从库承担读取操作。但由于主从库之间的同步存在延迟,可能导致从库读取到的数据并非最新。 解决方案一:提供同一个线程的Ddl执行统一库。即对于在同一个线程内的一系列数据定义语言(DDL)操作,确保都在主库上执行,这样可以避免主从同步延迟带来的数据不一致问题,因为在同一线程内操作主库,能保证数据的实时性和一致性。 解决方案二:提供Hint强制读写库。通过特定的Hint机制,开发者可以在代码中明确指定某些查询操作必须在主库上执行,绕过从库,从而获取最新的数据,适用于对数据实时性要求极高的场景,如金融交易中的账户余额查询等。 (二)强制读主问题 当应用需要获取最新数据时,可能会面临强制读主的需求。但在现有的读写分离架构下,常规的基于对象关系映射(ORM)的基础增删改查(CRUD)操作可能无法直接满足这一要求。 解决方法:需要重构ORM封装的基础CRUD。通过对ORM框架进行定制化开发或扩展,使其能够支持根据业务需求灵活选择从主库还是从库进行读取操作。例如,在特定的业务方法中,通过修改ORM的查询逻辑,添加强制读主的标识,让查询直接路由到主库,保证数据的及时性。 (三)Sql兼容问题 在使用ShardingSphere进行读写分离时,部分SQL语句可能会出现兼容性问题。 部分Sql语句不支持,需要换语句:例如“Select Distinct Test_Int From T_Order;”这样的语句可能无法直接在ShardingSphere环境下正常执行。此时,开发者需要根据ShardingSphere的语法和规则,对SQL语句进行改写,以满足数据库的操作要求。 Union(合并)相关语句示例:像“Select User_Id, Order_Id, Status From T_Order Union All Select Item_Id, Order_Id, User_Id From T_Order_Item”这样的Union操作语句,在使用时也需要注意其在ShardingSphere中的兼容性。可能需要对表结构、字段类型等进行进一步的检查和调整,确保Union操作能够正确执行,实现数据的合并查询需求。 三、事务问题 (一)Sharding-Jdbc不支持强事务 Sharding-Jdbc作为ShardingSphere的一种使用模式,在事务处理方面存在一定局限性,它不支持传统的强事务(如严格的ACID事务)。 解决策略一:尽量在业务处理事务。在应用层的业务逻辑中,通过合理的流程设计和代码编写,将相关的操作进行分组和协调,以满足业务对数据一致性的要求。例如,在电商系统的下单流程中,通过在业务代码中依次处理库存扣减、订单生成等操作,并进行异常捕获和回滚处理,来模拟事务的一致性效果。 解决策略二:使用Sharding-Proxy,支持多种分布式事务。Sharding-Proxy提供了对分布式事务更好的支持,它可以采用两阶段提交(2PC)、TCC(Try - Confirm - Cancel)等多种分布式事务解决方案。对于一些对事务一致性要求较高的场景,如银行转账业务,可以使用Sharding-Proxy结合合适的分布式事务方案,确保跨库操作的数据一致性。 四、总结 ShardingSphere在实现读写分离和处理事务时,虽然存在一些棘手的问题,但通过合理的技术选型和针对性的解决方案,能够有效应对。在实际项目中,开发者需要深入理解这些问题的本质和解决方案的原理,根据业务场景的特点,灵活运用相关策略,以充分发挥ShardingSphere的优势,构建高效、稳定、可靠的分布式数据库应用系统。
2020年02月02日
2019-07-19
MySQL与PostgreSQL的区别与简单对比
MySQL与PostgreSQL的区别与对比 MySQL和PostgreSQL都是极其流行的关系型数据库管理系统,但它们在设计理念、功能特性和使用场景上存在显著差异。以下是它们之间的主要区别与对比: 基本概述 MySQL: 起源于1995年,现由Oracle公司拥有 以速度和简单性为设计重点 广泛应用于Web应用程序,特别是LAMP架构(Linux, Apache, MySQL, PHP) PostgreSQL: 始于1986年的Berkeley Postgres项目 强调标准合规性和扩展性 被称为"最先进的开源数据库" 主要差异对比 1. 架构与设计理念 MySQL: 多存储引擎架构(InnoDB, MyISAM等) 注重简单性和性能 适合读密集型应用 PostgreSQL: 单一存储引擎 注重数据完整性和功能丰富性 适合复杂查询和大型数据库 2. 事务和ACID支持 MySQL: 在InnoDB引擎中完全支持ACID 其他引擎如MyISAM不完全支持事务 PostgreSQL: 完全支持ACID 提供更强的事务隔离默认级别 3. SQL标准合规性 MySQL: 实现了SQL标准的子集 有一些自定义的SQL扩展 PostgreSQL: 高度遵循SQL标准 支持更多SQL高级特性 4. 数据类型支持 MySQL: 基本数据类型支持良好 对JSON支持较晚引入 PostgreSQL: 丰富的数据类型(如数组、hstore、地理信息类型等) 早期就支持JSON/JSONB,并提供丰富操作函数 支持自定义数据类型 5. 并发控制 MySQL: 主要使用行级锁(InnoDB) 对高并发读取优化较好 PostgreSQL: 使用多版本并发控制(MVCC) 读不阻塞写,写不阻塞读 6. 性能表现 MySQL: 简单查询性能通常更好 读操作性能优秀 PostgreSQL: 复杂查询性能更优 写密集型应用表现优异 大数据量处理能力强 7. 复制与高可用 MySQL: 支持主从复制、组复制 有多种高可用解决方案(MySQL Cluster等) PostgreSQL: 支持流复制、逻辑复制 提供强大的故障转移和高可用功能(如Patroni) 8. 扩展性 MySQL: 插件系统有限 存储过程功能较基础 PostgreSQL: 强大的扩展系统 支持多种编程语言创建存储过程(PL/pgSQL, PL/Python等) 支持自定义运算符和索引类型 适用场景 MySQL更适合: 读密集型网站和应用 需要简单配置和管理的项目 OLTP(联机事务处理)工作负载 对成本敏感的项目 PostgreSQL更适合: 需要复杂查询的数据密集型应用 需要严格数据完整性的场景 地理信息系统(GIS)应用 数据仓库和分析应用 需要自定义数据类型和函数的场景 MySQL与PostgreSQL的SQL编写细节差异与案例 在MySQL和PostgreSQL之间,SQL语法和编写方式存在一些显著差异。以下是一些主要区别和具体案例: 标识符引用方式 MySQL:使用反引号`引用表名和列名 SELECT `user_id`, `username` FROM `users` WHERE `status` = 'active'; PostgreSQL:使用双引号"引用表名和列名 SELECT "user_id", "username" FROM "users" WHERE "status" = 'active'; 自增列定义 MySQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) ); PostgreSQL: CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) ); 字符串连接 MySQL:使用CONCAT函数 SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees; PostgreSQL:可以使用||运算符 SELECT first_name || ' ' || last_name AS full_name FROM employees; 限制结果集 MySQL: SELECT * FROM products ORDER BY price DESC LIMIT 10; PostgreSQL:支持LIMIT但也支持标准SQL的FETCH -- 使用LIMIT(类似MySQL) SELECT * FROM products ORDER BY price DESC LIMIT 10; -- 使用FETCH(SQL标准) SELECT * FROM products ORDER BY price DESC FETCH FIRST 10 ROWS ONLY; 日期时间处理 MySQL: -- 当前日期时间 SELECT NOW(), CURDATE(), DATE_FORMAT(created_at, '%Y-%m-%d'); -- 日期计算 SELECT DATE_ADD(order_date, INTERVAL 30 DAY) FROM orders; PostgreSQL: -- 当前日期时间 SELECT CURRENT_TIMESTAMP, CURRENT_DATE, TO_CHAR(created_at, 'YYYY-MM-DD'); -- 日期计算 SELECT order_date + INTERVAL '30 days' FROM orders; 正则表达式 MySQL: SELECT * FROM products WHERE product_name REGEXP '^Apple'; PostgreSQL: SELECT * FROM products WHERE product_name ~ '^Apple'; UPSERT操作(插入或更新) MySQL: INSERT INTO customers (id, name, email) VALUES (1, 'John Doe', 'john@example.com') ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email); PostgreSQL: INSERT INTO customers (id, name, email) VALUES (1, 'John Doe', 'john@example.com') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email; 分页查询案例 MySQL: -- 第3页,每页20条记录 SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET 40; PostgreSQL: -- 同样功能,但有多种写法 SELECT * FROM products ORDER BY created_at DESC LIMIT 20 OFFSET 40; -- 或使用FETCH SELECT * FROM products ORDER BY created_at DESC OFFSET 40 ROWS FETCH NEXT 20 ROWS ONLY; 全文搜索案例 MySQL: -- 首先添加全文索引 ALTER TABLE articles ADD FULLTEXT INDEX idx_content (title, content); -- 使用全文搜索 SELECT * FROM articles WHERE MATCH(title, content) AGAINST('database performance' IN BOOLEAN MODE); PostgreSQL: -- 创建tsvector列或索引 CREATE INDEX idx_fts ON articles USING GIN (to_tsvector('english', title || ' ' || content)); -- 使用全文搜索 SELECT * FROM articles WHERE to_tsvector('english', title || ' ' || content) @@ to_tsquery('english', 'database & performance'); JSON数据处理 MySQL: -- 创建表 CREATE TABLE user_data ( id INT PRIMARY KEY, profile JSON ); -- 插入JSON数据 INSERT INTO user_data VALUES (1, '{"name": "John", "preferences": {"theme": "dark", "notifications": true}}'); -- 查询JSON数据 SELECT id, JSON_EXTRACT(profile, '$.name') AS name, JSON_EXTRACT(profile, '$.preferences.theme') AS theme FROM user_data; PostgreSQL: -- 创建表 CREATE TABLE user_data ( id INT PRIMARY KEY, profile JSONB ); -- 插入JSON数据 INSERT INTO user_data VALUES (1, '{"name": "John", "preferences": {"theme": "dark", "notifications": true}}'); -- 查询JSON数据 SELECT id, profile->>'name' AS name, profile->'preferences'->>'theme' AS theme FROM user_data; -- 使用JSONB特有的包含操作符 SELECT * FROM user_data WHERE profile @> '{"preferences": {"theme": "dark"}}'; 递归查询案例(树形结构) MySQL:使用CTE (Common Table Expressions) -- 查询组织层次结构 WITH RECURSIVE org_hierarchy AS ( -- 基本情况:顶级节点 SELECT id, name, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL -- 递归情况:子节点 SELECT e.id, e.name, e.manager_id, oh.level + 1 FROM employees e JOIN org_hierarchy oh ON e.manager_id = oh.id ) SELECT * FROM org_hierarchy ORDER BY level, id; PostgreSQL:同样使用CTE,但有更多功能 -- 查询组织层次结构 WITH RECURSIVE org_hierarchy AS ( -- 基本情况:顶级节点 SELECT id, name, manager_id, 1 AS level, ARRAY[name] AS path, name::text AS full_path FROM employees WHERE manager_id IS NULL UNION ALL -- 递归情况:子节点 SELECT e.id, e.name, e.manager_id, oh.level + 1, oh.path || e.name, oh.full_path || ' > ' || e.name FROM employees e JOIN org_hierarchy oh ON e.manager_id = oh.id ) SELECT id, name, level, full_path FROM org_hierarchy ORDER BY path; 结论 这些例子展示了MySQL和PostgreSQL在SQL编写上的细微但重要的差异。在迁移数据库或者开发跨数据库应用时,了解这些差异可以帮助开发人员避免常见的陷阱和错误。PostgreSQL通常更紧密地遵循SQL标准,而MySQL则有更多的专有语法和简化操作。 MySQL和PostgreSQL各有优势,选择哪一个应当基于具体项目需求。MySQL以其简单性、性能和广泛采用而闻名,而PostgreSQL则以其功能丰富性、可扩展性和对复杂数据操作的支持著称。随着两者的不断发展,它们之间的差距正在缩小,但基本设计理念的差异依然明显。
2019年07月19日
2019-04-05
TIDB虚拟机部署笔记
TIDB学习笔记 tidb用户密码:tidb asd123ASD ssh 密钥 SHA256:YSA6u5H8Zn5qTL2XmIzivKeoTw0AAYWnQPfxBQBxx4s tidb@tidb-ansible-101 The key's randomart image is: +---[RSA 2048]----+ |*=.++++o.. | |+ o.o.+o. | |ooo ...+ | |.o + E o . | | * . S | | *. . | | oo=o + . | | +.+= * o | |+o**oo . | +----[SHA256]-----+ 部署注意 1.机器的计算机名不能相同 2.初始化参数时报错 This machine does not have sufficient CPU to run TiDB, at least 8 cores 类似相关硬件限制问题可修改roles/check_system_optional/defaults/main.yml文件里的参数来解决如上面问题可以修改tidb_min_cpu参数 注意,修改参数时不能在行尾部留空格,不然报错 3.报 fatal: [192.168.56.223]: FAILED! => {"changed": false, "failed_when_result": true, "rc": 0, "stderr": "Shared connection to 192.168.56.223 closed.\r\n", "stderr_lines": ["Shared connection to 192.168.56.223 closed."], "stdout": "/dev/mapper/centos-root 8.0G 8.0G 280K 100% /\r\n", "stdout_lines": ["/dev/mapper/centos-root 8.0G 8.0G 280K 100% /"]} 错误tikv虚拟机根目录分区太小,需要扩容 https://www.codetd.com/article/2284025 虚拟机安装可参考此篇 https://blog.csdn.net/sunny05296/article/details/65980897/ npt时间同步配置可参考此篇 执行:ansible-playbook bootstrap.yml 如果报 fio randread iops of deploy_dir disk is too low 原因是:硬盘太慢,tidb对硬盘的IOPS有一定的要求,要大于40000,生产环境官方建议使用 NVMe SSD 硬盘 使用dev模式 参考https://github.com/pingcap/tidb-ansible/issues/521 ansible-playbook bootstrap.yml --extra-vars "dev_mode=True" Grafana Web 默认账号: admin 密码: admin 参考此篇安装https://www.codetd.com/article/2284025 注意:主机名一定不能冲突,hostnamectl set-hostname tidb-server-191 常见错误:http://1bb.work/jxadd/article_detail/3426
2019年04月05日
2017-02-17
flyway与liquibase区别
Flyway 易于配置——你只需要指定一个文件夹位置,并遵循命名语法,如 V1__file.sql 等等。 基于 SQL,但你需要编写符合特定数据库引擎(如 MySQL、DB2 等)的正确语法。 基于 Java,因此添加自定义配置(如清理、执行等操作的配置)会更加容易。 Liquibase 需要一个主文件“changelog(变更日志)”来跟踪所有已执行的变更集。 基于 XML,所以你需要使用特定的 Liquibase 标签来创建 SQL 代码。这对于将代码迁移到不同的数据库引擎来说非常完美:你无需做任何更改,仅需数据库驱动程序告知 Liquibase 如何将 XML 标签转换为正确的 SQL 语法即可。 如果你使用 Liquibase 的 sql 标签,那么你将无法利用上述第二点的优势,在这种情况下,使用 Flyway 会更好。 Liquibase 提供了一个 JAR 文件,可以自动将现有数据库迁移为所有需要的 XML 文件,因此你无需手动处理这些文件,这非常有用。 现在,就需要你根据项目需求来决定使用哪个工具了,比如你是否需要在未来迁移到不同的数据库引擎等等。 梳理总结: Flyway:配置简单,基于 SQL 但依赖特定数据库语法,基于 Java 便于自定义配置。 Liquibase:依赖“changelog”文件跟踪变更,基于 XML 可方便跨数据库引擎迁移(不使用 sql 标签时),有自动将现有数据库转换为 XML 文件的工具,功能较为丰富。选择时需考虑项目未来是否有数据库引擎迁移需求等因素。
2017年02月17日