分布式数据库-主从复制--ShardingJDBC

#一. ShardingSphere

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

官网:http://shardingsphere.apache.org/index_zh.html
下载地址:https://shardingsphere.apache.org/document/current/cn/downloads/
快速入门:https://shardingsphere.apache.org/document/current/cn/quick-start/shardingsphere-jdbc-quick-start/

分布式数据库-主从复制--ShardingJDBC_第1张图片

适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。

支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。

认识shardingjdbc功能架构图:

分布式数据库-主从复制--ShardingJDBC_第2张图片

认识Sharding-Proxy:

分布式数据库-主从复制--ShardingJDBC_第3张图片
向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用。
适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。

三个组件的比较:

分布式数据库-主从复制--ShardingJDBC_第4张图片

ShardingJdbc混合架构

分布式数据库-主从复制--ShardingJDBC_第5张图片

ShardingSphere-JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP(连接事务处理) 应用;ShardingSphere-Proxy 提供静态入口以及异构语言的支持,适用于 OLAP(连接数据分析) 应用以及对分片数据库进行管理和运维的场景。

Apache ShardingSphere 是多接入端共同组成的生态圈。 通过混合使用 ShardingSphere-JDBC 和 ShardingSphere-Proxy,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,使得架构师更加自由地调整适合与当前业务的最佳系统架构。

.ShardingShpere的功能清单

  • 功能列表
    数据分片
    分库 & 分表
    读写分离
    分片策略定制化
    无中心化分布式主键

  • 分布式事务
    标准化事务接口
    XA 强一致事务
    柔性事务
    数据库治理

  • 分布式治理
    弹性伸缩
    可视化链路追踪
    数据加密

ShardingSphere数据分片内核剖析

ShardingSphere 的 3 个产品的数据分片主要流程是完全一致的。 核心由 SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并的流程组成。

分布式数据库-主从复制--ShardingJDBC_第6张图片

  • SQL 解析
    分为词法解析和语法解析。 先通过词法解析器将 SQL 拆分为一个个不可再分的单词。再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。 解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记。

  • 执行器优化
    合并和优化分片条件,如 OR 等。

  • SQL 路由
    根据解析上下文匹配用户配置的分片策略,并生成路由路径。目前支持分片路由和广播路由。

  • SQL 改写
    将 SQL 改写为在真实数据库中可以正确执行的语句。SQL 改写分为正确性改写和优化改写。

  • SQL 执行
    通过多线程执行器异步执行。

  • 结果归并
    将多个执行结果集归并以便于通过统一的 JDBC 接口输出。结果归并包括流式归并、内存归并和使用装饰者模式的追加归并这几种方式。

二.Linux安装MySQL5.7

1、yum安装mysql

1-1、下载mysql的rpm地址
http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/

分布式数据库-主从复制--ShardingJDBC_第7张图片

1-2、配置Mysql扩展源

rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm

1-3、yum安装mysql

yum install mysql-community-server -y

1-4、启动Mysql,并加入开机自启

systemctl start mysqld
systemctl stop mysqld
systemctl enable mysqld

1-5、使用Mysq初始密码登录数据库

初始密码查看文件得知

>grep "password" /var/log/mysqld.log
> mysql -uroot -pma1S8xjuEA/F
或者一步到位的做法如下
>mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)

1-6、修改数据库密码
数据库默认密码规则必须携带大小写字母、特殊符号,字符长度大于8否则会报错。
因此设定较为简单的密码时需要首先修改set global validate_password_policy和_length参数值。

分布式数据库-主从复制--ShardingJDBC_第8张图片

mysql> set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)

1-7、修改密码

mysql> set password for root@localhost = password('mkxiaoer');
Query OK, 0 rows affected, 1 warning (0.00 sec)
或者
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

1-8、登录测试


[root@http-server ~]# mysql -uroot -pmkxiaoer
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> exit

1-9、可视化工具的登录授权:(如果授权不成功,请查看防火墙)
操作完成上面的,现在还不能用可视化的客户端进行连接,需要我们进行授权:

mysql > grant all on *.* to root@'%' identified by '数据库密码';
mysql > flush privileges;

操作完毕,接下来可以使用navicat或者sqlylog进行远程连接了.

sqlylog的下载:https://sqlyog.en.softonic.com/

三.ShardingJdbc准备 - MySql完成主从复制

主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。

复制是异步的 从站不需要永久连接以接收来自主站的更新。

根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。

Replication 的原理

分布式数据库-主从复制--ShardingJDBC_第9张图片

3.1前提

是作为主服务器角色的数据库服务器必须开启二进制日志

主服务器上面的任何修改都会通过自己的 I/O tread(I/O 线程)保存在二进制日志 Binary log 里面。

从服务器上面也启动一个 I/O thread,通过配置好的用户名和密码, 连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Realy log(中继日志)里面。
从服务器上面同时开启一个 SQL thread 定时检查 Realy log(这个文件也是二进制的),如果发现有更新立即把更新的内容在本机的数据库上面执行一遍。
每个从服务器都会收到主服务器二进制日志的全部内容的副本。
从服务器设备负责决定应该执行二进制日志中的哪些语句。
除非另行指定,否则主从二进制日志中的所有事件都在从站上执行。
如果需要,您可以将从服务器配置为仅处理一些特定数据库或表的事件。

3.2配置

###3.2.1Master节点配置/etc/my.cnf (master节点执行)

> vim /etc/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=100  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed

###3.2.2Slave节点配置/etc/my.cnf (slave节点执行)

> vim /etc/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=102
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

###3.2.3 在master服务器授权slave服务器可以同步权限(master节点执行)
注意:在master服务器上执行

mysql > mysql -uroot -pmaster的密码
# 授予slave服务器可以同步master服务
mysql > grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码';
mysql > flush privileges;
# 查看MySQL现在有哪些用户及对应的IP权限(可以不执行,只是一个查看)
mysql > select user,host from mysql.user;

分布式数据库-主从复制--ShardingJDBC_第10张图片

###3.2.4 查询master服务的binlog文件名和位置(master节点执行)

mysql > show master status;

分布式数据库-主从复制--ShardingJDBC_第11张图片

日志文件名:mysql-bin.000002
复制的位置:2079

3.2.5 slave进行关联master节点(slave节点执行)

进入到slave节点:

mysql > mysql -uroot -p你slave的密码

开始绑定

mysql> change master to master_host='master服务器ip', master_user='root', master_password='master密码', master_port=3306, master_log_file='mysql-bin.000002',master_log_pos=2079;

这里注意一下 master_log_file 和 master_log_pos 都是通过 master服务器通过show master status获得。

3.2.6 在slave节点上查看主从同步状态(slave节点执行)

启动主从复制

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

再查看主从同步状态

mysql> show slave status\G;

分布式数据库-主从复制--ShardingJDBC_第12张图片

其他命令 (slave节点执行)

# 停止复制
mysql> stop slave;

3.2.7主从复制测试

1:在master下创建数据库和表,或者修改和新增,删除记录都会进行同步(master节点执行)
2:点击查看slave节点信息(slave节点执行)

3.2.8切记

在主从复制操作的时候,不要基于去创建数据库或者相关操作。然后又去删除。这样会造成主从复制的pos改变,而造成复制失败,如果出现此类问题,查看3.3.3的常见问题排查。

3.3.主从复制相关问题排查

3.3.1 主从复制Connecting问题

分布式数据库-主从复制--ShardingJDBC_第13张图片

使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,这种情况一般是下面几种原因造成的,我们可以根据 Last_IO_Error提示予以排除。

  • 网络不通
  • 检查ip,端口
  • 密码不对
  • 检查是否创建用于同步的用户和用户密码是否正确
  • pos不对
  • 检查Master的 Position

3.3.2 MYSQL镜像服务器因错误停止的恢复 —Slave_SQL_Running: No

先stop slave,然后执行了一下提示的语句,再
 > stop slave;
 > set global sql_slave_skip_counter=1;
 > start slave; 
 > show slave status\G ;

3.3.3 从MYSQL服务器Slave_IO_Running: No的解决

master节点执行,获取日志文件和post

mysql > show master status;

slave节点进行重新绑定

mysql > stop slave;
mysql > CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=519086591; 
mysql > start slave;

造成这类问题的原因一般是在主从复制的时候,基于创建表,然后又去删除和操作了数据表或者表。

你可能感兴趣的:(数据库,分布式,postgresql)