Sharding - JDBC的使用及其项目实战

Sharding - JDBC

文章目录

        • Sharding - JDBC
        • 1.ShardingSphere的三部曲
          • 1.1 ShardingSphere - JDBC
          • 1.2 ShardingSphere - Proxy
        • 2.搭建MySQL读写分离
          • 2.1 Master节点修改配置(master节点的 "/etc/my.cnf")
          • 2.2 Slave节点修改配置(slave节点的 "/etc/my.cnf")
          • 2.3 主从复制报错
          • 2.3 读写分离,主从复制(1主2从)
        • 3.分库分表
        • 4.读写分离 分库分表 代码实战
          • 4.1 读写分离
          • 4.3 分库分表

1.ShardingSphere的三部曲


	ShardingSphere的三部曲
	1.ShardingSphere - JDBC  ( 可理解为增强版的 JDBC 驱动 )
	2.ShardingSphere - Proxy( sharding-proxy 相当于 mycat,单独一个服务)
	3.ShardingSphere - Sidecar(TODO)
	
1.1 ShardingSphere - JDBC

Sharding - JDBC的使用及其项目实战_第1张图片

1.2 ShardingSphere - Proxy

Sharding - JDBC的使用及其项目实战_第2张图片

2.搭建MySQL读写分离


	## 1.配置mysql扩展源
	rpm -ivh http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
	
	## 2.yum安装mysql
	yum install mysql-community-server -y
	
	## 3.启动mysql,并加入开机自启
	systemctl start mysqld
	systemctl stop mysqld
	systemctl enable mysqld      -- 设置mysql服务开机自启动
	systemctl status mysqld      -- 查看mysql服务启动状态

	## 4.使用msql初始密码登录数据库
	mysql -uroot -p$(awk '/temporary password/{print $NF}' /var/log/mysqld.log)
	
	## 5.修改密码
	-- 降低mysql设置密码的难度(不更改密码需要包含大小写等字符)
	set global validate_password_policy=0;
	set global validate_password_length=1;
	-- 修改密码
	ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
	-- 退出mysql服务
	quit;                          
	-- 命令行到登录mysql
	mysql -uroot -proot           
	-- 授权远程登录
	grant all on *.* to root@'%' identified by 'root';
	-- 涮新
	flush privileges;
	
	## 6.本地远程连接云服务器
	## 本地远程连接linux服务器

	注:
	  主从复制 --> 从数据库层面说的
	  读写分离 --> 代码业务层面说的
	
2.1 Master节点修改配置(master节点的 “/etc/my.cnf”)

①需改配置文件保存二进制文件


	>vim /etc/my.cnf

	## 找到"[mysqld]"下面复制下面的配置

	[mysqlId]
	## 唯一id
	server-id=100
	## 开启二进制日志功能,名字可以随便取
	log-bin=mysql-bin
	## 复制过滤:不需要备份的数据库(mysql的mysql库一般不需要同步)
	binlog-ignore-db=mysql
	## 下面的这些配置可以不需要写
	## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
	binlog_cache_size=1M
	## 主从复制的格式(mixed,statement,row,默认格式是statement)
	binlog_format=mixed

注:配置完需要重启

Sharding - JDBC的使用及其项目实战_第3张图片

②mater服务器给slave服务器授权


	mysql -uroot -proot
	## 授予slave服务器可以同步master服务
	grant replication slave,replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码'; 
	## 刷新
	flush privileges;

	## 查看mysql现在有哪些用户及对应的ip权限(可以不执行,只是一个查看)
	select user,host from mysql.user;

③查询master服务器的binlog文件名和位置


	show master status;

Sharding - JDBC的使用及其项目实战_第4张图片

2.2 Slave节点修改配置(slave节点的 “/etc/my.cnf”)

①需改配置文件保存二进制文件


	>vim /etc/my.cnf

	## 找到"[mysqld]"下面复制下面的配置
	
	[mysqlId]
	## 唯一id
	server-id=102
	## 开启二进制日志功能,以备slave作为其他slave的master时使用
	log-bin=mysql-slave-bin
	## relay_log配置中继日志
	relay_log=edu-mysql-relay-bin
	## 复制过滤:不需要备份的数据库(mysql的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

注:配置完需要重启

②slave服务器进行关联master服务器


	mysql>mysql -uroot -proot

	-- "master_log_file"和"master_log_pos" 在master机上"show master status;"
	change master to master_host='master服务器ip',master_user='root',master_password='master密码',master_port=3306,master_log_file='master查到的',master_log_pos=master查到的;

Sharding - JDBC的使用及其项目实战_第5张图片

③在slave节点查看主从同步状态


	## 启动主从复制
	start slave;
	## 再查看主从同步状态
	show slave status\G;

	## 停止复制
	stop slave;

Sharding - JDBC的使用及其项目实战_第6张图片

2.3 主从复制报错

①从服务器没有同步主服务器的数据

Sharding - JDBC的使用及其项目实战_第7张图片

②输入主服务器的密码错误

Sharding - JDBC的使用及其项目实战_第8张图片


	## 原因1:复制位置发生改变(这种可能性比较大)

	## 操作从服务器
	## 停止复制
	stop slave;
	## "master_log_file"和"master_log_pos" 在master机上"show master status;"
	change master to master_host='master服务器ip',master_user='root',master_password='master密码',master_port=3306,master_log_file='master查到的',master_log_pos=master查到的;
	## 启动主从复制
	start slave;


	## 原因2:更改服务器了
	
	## 操作从服务器
	## 停止复制
	stop slave;
	set global sql_slave_skip_counter=1;
	## 启动主从复制
	start slave;
	## 再查看主从同步状态
	show slave status\G;

2.3 读写分离,主从复制(1主2从)

Sharding - JDBC的使用及其项目实战_第9张图片

主从复制原理(数据层面的东西)

Sharding - JDBC的使用及其项目实战_第10张图片

读写分离(shardingJDBC:业务层面的东西)

Sharding - JDBC的使用及其项目实战_第11张图片

3.分库分表

水平分表,垂直分表

Sharding - JDBC的使用及其项目实战_第12张图片

4.读写分离 分库分表 代码实战

4.1 读写分离

mysql的主从两个服务器

Sharding - JDBC的使用及其项目实战_第13张图片

读只会使用2台从服务器(“http://localhost:8085/user/listuser”)

Sharding - JDBC的使用及其项目实战_第14张图片

写只会在主服务器(“http://localhost:8085/user/save”)

Sharding - JDBC的使用及其项目实战_第15张图片

4.3 分库分表

分库分表查询语句会查询所有库和所有表的数据(“http://localhost:8085/user/listuser”)

Sharding - JDBC的使用及其项目实战_第16张图片

分库分表带来的问题


	分库分表后,本地事务已经不能保证事务,需要分布式事务
	
	## 本地事务
	@Transactional(rollbackFor = Exception.class)

	## Sharding提供的分布式事务
	## 扣钱-->强一致性 ; 订单 --> 弱一致性,柔性
	@Transactional(rollbackFor = Exception.class)
	@ShardingTransactionType(TransactionType.XA)

你可能感兴趣的:(1.JAVA)