当前位置:   article > 正文

docker部署mysql集群并与springboot整合_springboot mysql集群

springboot mysql集群

一、mysql的集群部署方案

MySQL 集群部署方案有以下几种:

  1. MySQL Cluster:MySQL 官方提供的 MySQL 集群方案,它通过对 MySQL 的源码进行修改,实现了 MySQL 集群的分布式功能。

  1. Galera Cluster:Galera Cluster 是一个基于 MySQL 的高可用性解决方案,它通过对 MySQL 的主从复制功能进行扩展,实现了 MySQL 集群的高可用性和扩展性。

  1. Percona XtraDB Cluster:Percona XtraDB Cluster 是一个基于 MySQL 的高可用性解决方案,它通过对 MySQL 的主从复制功能进行扩展,实现了 MySQL 集群的高可用性和扩展性。

  1. MySQL Replication:MySQL Replication 是 MySQL 官方提供的高可用性方案,它通过对 MySQL 的主从复制功能进行扩展,实现了 MySQL 集群的高可用性。

  1. MySQL Proxy:MySQL Proxy 是一个 MySQL 代理,它可以将多个 MySQL 实例转化为一个 MySQL 集群,提供了对 MySQL 集群的负载均衡、故障转移等功能。

二、docker部署mysql主从复制(一主多从)

主节点

准备docker-compose.yml文件

  1. version: '3.1'
  2. services:
  3. mysql-master:
  4. image: mysql:8.0.32
  5. container_name: mysql-master
  6. restart: always
  7.     network_mode: "host"
  8. environment:        
  9. TZ: Asia/Shanghai # 时区上海
  10. MYSQL_ROOT_PASSWORD: "123456" #mysql密码
  11. ports:
  12. - "3306:3306"
  13. volumes:
  14. - ./data:/var/lib/mysql
  15.       - ./log:/var/log/mysql
  16. - ./conf:/etc/mysql/conf.d

准备 my.cnf配置文件(可自行去官网下载,修改以下字段即可)

  1. [mysqld]
  2. #Mysql服务的唯一编号 每个mysql服务Id需唯一
  3. server-id=11
  4. # [必须]启用二进制日志
  5. log-bin=mysql-bin
  6. log-bin-index=mysql-bin.index
  7. binlog-ignore-db=mysql
  8. # 设置需要同步的数据库 binlog_do_db = 数据库名;
  9. # 如果是多个同步库,就以此格式另写几行即可。
  10. # 如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库
  11. # 跳过所有的错误,继续执行复制操作
  12. slave-skip-errors=all
  13. # 二进制日志过期清理时间。默认值为0,表示不自动清理。
  14. binlog_expire_logs_seconds=2592000
  15. #以下内容每个节点保持一致
  16. # By default we only accept connections from localhost
  17. bind-address="0.0.0.0"
  18. #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
  19. character-set-server=utf8mb4
  20. #数据库字符集对应一些排序等规则,注意要和character-set-server对应
  21. collation-server=utf8mb4_general_ci
  22. #设置client连接mysql时的字符集,防止乱码
  23. init_connect='SET NAMES utf8mb4'
  24. #是否对sql语句大小写敏感,1表示不敏感
  25. lower_case_table_names = 1
  26. #设置加密方式
  27. default_authentication_plugin=mysql_native_password

从节点

准备docker-compose.yml文件

  1. version: '3.1'
  2. services:
  3. mysql-master:
  4. image: mysql:8.0.32
  5. container_name: mysql-slave01
  6. restart: always
  7. network_mode: "host"
  8. environment:
  9. TZ: Asia/Shanghai # 时区上海
  10. MYSQL_ROOT_PASSWORD: "123456" #mysql密码
  11. ports:
  12. - "3306:3306"
  13. volumes:
  14. - ./data:/var/lib/mysql
  15. - ./log:/var/log/mysql
  16. - ./conf:/etc/mysql/conf.d

准备 my.cnf配置文件

  1. [mysqld]
  2. #Mysql服务的唯一编号 每个mysql服务Id需唯一
  3. server-id=12
  4. # 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
  5. log-bin=mysql-bin
  6. log-bin-index=mysql-bin.index
  7. binlog-ignore-db=mysql
  8. # 设置需要同步的数据库 binlog_do_db = 数据库名;
  9. # 如果是多个同步库,就以此格式另写几行即可。
  10. # 如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库
  11. # 跳过所有的错误,继续执行复制操作
  12. slave-skip-errors = all
  13. # slave设置为只读(具有super权限的用户除外)
  14. read_only=1
  15. ## relay_log配置中继日志
  16. relay_log=mysql-relay-bin
  17. ## log_slave_updates表示slave将复制事件写进自己的二进制日志
  18. log_slave_updates=1
  19. # 二进制日志过期清理时间。默认值为0,表示不自动清理。
  20. binlog_expire_logs_seconds=2592000
  21. #以下内容每个节点保持一致
  22. # By default we only accept connections from localhost
  23. bind-address="0.0.0.0"
  24. #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
  25. character-set-server=utf8mb4
  26. #数据库字符集对应一些排序等规则,注意要和character-set-server对应
  27. collation-server=utf8mb4_general_ci
  28. #设置client连接mysql时的字符集,防止乱码
  29. init_connect='SET NAMES utf8mb4'
  30. #是否对sql语句大小写敏感,1表示不敏感
  31. lower_case_table_names = 1
  32. #设置加密方式
  33. default_authentication_plugin=mysql_native_password

配置mysql主从

进入master节点

docker exec -it mysql-master mysql -u root -p

执行如下代码添加slave01、slave02用户。

  1. #在主机MySQL里执行授权命令
  2. CREATE USER 'slave01'@'%' IDENTIFIED BY '123456';
  3. GRANT REPLICATION SLAVE ON *.* TO 'slave01'@'%';
  4. #此语句必须执行。否则见下面。
  5. ALTER USER 'slave01'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  6. #在主机MySQL里执行授权命令
  7. CREATE USER 'slave02'@'%' IDENTIFIED BY '123456';
  8. GRANT REPLICATION SLAVE ON *.* TO 'slave02'@'%';
  9. #此语句必须执行。否则见下面。
  10. ALTER USER 'slave02'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  11. flush privileges;
  12. #查询master的状态,记住file和position对应的信息,为后来添加从到主做准备。
  13. show master status;
  14. +------------------+----------+--------------+------------------+-------------------+
  15. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  16. +------------------+----------+--------------+------------------+-------------------+
  17. | mysql-bin.000003 | 1912 | | mysql | |
  18. +------------------+----------+--------------+------------------+-------------------+
  19. 1 row in set (0.00 sec)

slave01中配置主从

  1. docker exec -it mysql-slave01 mysql -u root -p
  2. #host替换为配置master的ip,master_log_file就是之前master对应的file信息,master_log_pos就是之前position对应的信息
  3. change master to master_host='192.168.10.11', master_user='slave01', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=1912, master_connect_retry=30;
  4. start slave;
  5. # 查看slave信息,如果Slave_IO_Running、Slave_SQL_Running两个信息是yes代表搭建从库成功
  6. show slave status \G;
  7. *************************** 1. row ***************************
  8. Slave_IO_State: Waiting for source to send event
  9. Master_Host: 192.168.10.11
  10. Master_User: slave01
  11. Master_Port: 3306
  12. Connect_Retry: 30
  13. Master_Log_File: mysql-bin.000003
  14. Read_Master_Log_Pos: 1912
  15. Relay_Log_File: mysql-relay-bin.000002
  16. Relay_Log_Pos: 326
  17. Relay_Master_Log_File: mysql-bin.000003
  18. Slave_IO_Running: Yes
  19. Slave_SQL_Running: Yes
  20. Replicate_Do_DB:
  21. Replicate_Ignore_DB:
  22. Replicate_Do_Table:
  23. Replicate_Ignore_Table:
  24. Replicate_Wild_Do_Table:
  25. Replicate_Wild_Ignore_Table:
  26. Last_Errno: 0
  27. Last_Error:
  28. Skip_Counter: 0
  29. Exec_Master_Log_Pos: 1912
  30. Relay_Log_Space: 536
  31. Until_Condition: None
  32. Until_Log_File:
  33. Until_Log_Pos: 0
  34. Master_SSL_Allowed: No
  35. Master_SSL_CA_File:
  36. Master_SSL_CA_Path:
  37. Master_SSL_Cert:
  38. Master_SSL_Cipher:
  39. Master_SSL_Key:
  40. Seconds_Behind_Master: 0
  41. Master_SSL_Verify_Server_Cert: No
  42. Last_IO_Errno: 0
  43. Last_IO_Error:
  44. Last_SQL_Errno: 0
  45. Last_SQL_Error:
  46. Replicate_Ignore_Server_Ids:
  47. Master_Server_Id: 11
  48. Master_UUID: 18e50f5e-cba8-11ed-b275-000c2930730f
  49. Master_Info_File: mysql.slave_master_info
  50. SQL_Delay: 0
  51. SQL_Remaining_Delay: NULL
  52. Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  53. Master_Retry_Count: 86400
  54. Master_Bind:
  55. Last_IO_Error_Timestamp:
  56. Last_SQL_Error_Timestamp:
  57. Master_SSL_Crl:
  58. Master_SSL_Crlpath:
  59. Retrieved_Gtid_Set:
  60. Executed_Gtid_Set:
  61. Auto_Position: 0
  62. Replicate_Rewrite_DB:
  63. Channel_Name:
  64. Master_TLS_Version:
  65. Master_public_key_path:
  66. Get_master_public_key: 0
  67. Network_Namespace:
  68. 1 row in set, 1 warning (0.00 sec)

slave02同上

https://cloud.tencent.com/developer/article/2074869

三、springboot整合mysql集群

读写分离,主库写从库读

以下是一些流行的分库分表中间件:

  1. Sharding-JDBC:Sharding-JDBC是一个非常流行的分库分表中间件,可以帮助您轻松地实现数据库的水平扩展。它支持多种分片策略,并且可以与Spring Boot集成。如果您需要对数据库进行水平扩展,那么Sharding-JDBC是一个非常好的选择。

  1. MyCAT:MyCAT是一个开源的分布式数据库系统,可以实现MySQL的分库分表和读写分离。它支持多种分片策略,并且可以与MySQL和MariaDB集成。

  1. TDDL:TDDL是一个阿里巴巴开发的分布式数据库中间件,可以实现MySQL的分库分表和读写分离。它支持多种分片策略,并且可以与Spring和MyBatis集成。

  1. Cobar:Cobar是一个开源的分布式数据库中间件,可以实现MySQL的分库分表和读写分离。它支持多种分片策略,并且可以与MySQL和MariaDB集成。

  1. Sharding-JDBC读写分离

参考官方文档 Yaml配置 :: ShardingSphere (apache.org)

注:shardingsphere-jdbc5和之前的版本配置有区别,对应的springboot-start包名有所不同

引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.7.10</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>
  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
  4. <version>5.2.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.baomidou</groupId>
  8. <artifactId>mybatis-plus-boot-starter</artifactId>
  9. <version>3.5.3.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>com.mysql</groupId>
  13. <artifactId>mysql-connector-j</artifactId>
  14. <scope>runtime</scope>
  15. </dependency>

编写yml配置

  1. spring:
  2. #sharding-jdbc
  3. shardingsphere:
  4. datasource:
  5. names: master,slave01,slave02
  6. master:
  7. type: com.zaxxer.hikari.HikariDataSource
  8. driver-class-name: com.mysql.cj.jdbc.Driver
  9. url: jdbc:mysql://192.168.10.11:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true
  10. username: root
  11. password: 123456
  12. slave01:
  13. type: com.zaxxer.hikari.HikariDataSource
  14. driver-class-name: com.mysql.cj.jdbc.Driver
  15. url: jdbc:mysql://192.168.10.12:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true
  16. username: root
  17. password: 123456
  18. slave02:
  19. type: com.zaxxer.hikari.HikariDataSource
  20. driver-class-name: com.mysql.cj.jdbc.Driver
  21. url: jdbc:mysql://192.168.10.13:3306/test?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true
  22. username: root
  23. password: 123456
  24. rules:
  25. readwrite-splitting:
  26. data-sources:
  27. ## 读写分离名称
  28. pr_ds:
  29. type: STATIC #静态类型,(动态Dynamic)
  30. props:
  31. ## 自动发现数据源名称
  32. # auto-aware-data-source-name: slave0
  33. ## 写数据源名称
  34. write-data-source-name: master
  35. ## 读数据源名称
  36. read-data-source-names: slave01,slave02
  37. ## 负载均衡算法名称
  38. load-balancer-name: read-write-separation-load-balancer
  39. load-balancers:
  40. read-write-separation-load-balancer:
  41. ## 负载均衡算法类型
  42. type: ROUND_ROBIN
  43. props:
  44. sql-show: true # 开启SQL显示,默认false

测试

  1. @Test
  2. void saveAndGet() {
  3. Student student = new Student("test", 11);
  4. studentService.save(student);
  5. Student student1 = studentService.getById(10);
  6. System.out.println(student1);
  7. }

日志输出

  1. Creating a new SqlSession
  2. SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2a7ebe07] was not registered for synchronization because synchronization is not active
  3. JDBC Connection [org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.MasterSlaveConnection@3cd46491] will not be managed by Spring
  4. ==> Preparing: INSERT INTO student ( name, age ) VALUES ( ?, ? )
  5. 2023-04-06 21:14:40.535 INFO 22688 --- [main] ShardingSphere-SQL: Logic SQL: INSERT INTO student ( name,age ) VALUES ( ?,? )
  6. 2023-04-06 21:14:40.535 INFO 22688 --- [main] ShardingSphere-SQL: SQLStatement: CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7b29cdea, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@f08d676)
  7. 2023-04-06 21:14:40.535 INFO 22688 --- [main] ShardingSphere-SQL: Actual SQL: master ::: INSERT INTO student ( name,age ) VALUES ( ?,? )
  8. ==> Parameters: test(String), 11(Integer)
  9. <== Updates: 1
  10. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2a7ebe07]
  11. Creating a new SqlSession
  12. SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@511d5e6e] was not registered for synchronization because synchronization is not active
  13. JDBC Connection [org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.MasterSlaveConnection@299eca90] will not be managed by Spring
  14. ==> Preparing: SELECT id,name,age FROM student WHERE id=?
  15. 2023-04-06 21:14:40.588 INFO 22688 --- [main] ShardingSphere-SQL: Logic SQL: SELECT id,name,age FROM student WHERE id=?
  16. 2023-04-06 21:14:40.588 INFO 22688 --- [main] ShardingSphere-SQL: SQLStatement: SelectStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.SelectStatement@6b289535, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@74619273), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@74619273, projectionsContext=ProjectionsContext(startIndex=7, stopIndex=17, distinctRow=false, projections=[ColumnProjection(owner=null, name=id, alias=Optional.empty), ColumnProjection(owner=null, name=name, alias=Optional.empty), ColumnProjection(owner=null, name=age, alias=Optional.empty)]), groupByContext=org.apache.shardingsphere.sql.parser.binder.segment.select.groupby.GroupByContext@38c55a8a, orderByContext=org.apache.shardingsphere.sql.parser.binder.segment.select.orderby.OrderByContext@1d7f7962, paginationContext=org.apache.shardingsphere.sql.parser.binder.segment.select.pagination.PaginationContext@32d1d6c5, containsSubquery=false)
  17. 2023-04-06 21:14:40.588 INFO 22688 --- [main] ShardingSphere-SQL: Actual SQL: slave01 ::: SELECT id,name,age FROM student WHERE id=?
  18. ==> Parameters: 10(Integer)
  19. <== Columns: id, name, age
  20. <== Row: 10, java, 22
  21. <== Total: 1
  22. Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@511d5e6e]

显示插入走的是master,查询走的是slave01

Actual SQL: master ::: INSERT INTO student ( name,age ) VALUES ( ?,? )

Actual SQL: slave01 ::: SELECT id,name,age FROM student WHERE id=?

  1. Sharding-JDBC分库分表

水平分表

  1. server:
  2. port: 8089
  3. spring:
  4. shardingsphere:
  5. mode:
  6. type: memory
  7. # 是否开启
  8. datasource:
  9. # 数据源(逻辑名字)
  10. names: master
  11. # 配置数据源
  12. master:
  13. type: com.zaxxer.hikari.HikariDataSource
  14. driver-class-name: com.mysql.cj.jdbc.Driver
  15. url: jdbc:mysql://192.168.10.11:3306/test?useSSL=false&autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
  16. username: root
  17. password: 123456
  18. # 分片的配置
  19. rules:
  20. sharding:
  21. # 表的分片策略
  22. tables:
  23. # 逻辑表的名称
  24. student:
  25. # 数据节点配置,采用Groovy表达式
  26. actual-data-nodes: master.student_$->{0..3}
  27. # 配置策略
  28. table-strategy:
  29. # 用于单分片键的标准分片场景
  30. standard:
  31. sharding-column: id
  32. # 分片算法名字
  33. sharding-algorithm-name: student_inline
  34. key-generate-strategy: # 主键生成策略
  35. column: id # 主键列
  36. key-generator-name: snowflake # 策略算法名称(推荐使用雪花算法)
  37. key-generators:
  38. snowflake:
  39. type: SNOWFLAKE
  40. sharding-algorithms:
  41. student_inline:
  42. type: inline
  43. props:
  44. algorithm-expression: student_$->{id % 4}
  45. props:
  46. # 日志显示具体的SQL
  47. sql-show: true
  48. logging:
  49. level:
  50. com.wang.test.demo: DEBUG
  51. mybatis-plus:
  52. configuration:
  53. #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射 address_book ---> addressBook
  54. map-underscore-to-camel-case: true
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57783
推荐阅读
相关标签
  

闽ICP备14008679号