一、mysql-router:簡單理解就是集羣的路由,通過路由來訪問具體的數據庫集羣。
二、本編介紹如何搭建docker版的MGR集羣
1、dockerfile
Dockerfile-cluster
FROM mysql:8.0.19 MAINTAINER xbd RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Dockerfile-router
FROM mysql/mysql-router:8.0.19 MAINTAINER xbd RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ADD ./config/mysql-shell/mysql-shell-8.0.19.tar.gz /mysql-shell/
說明:這裏添加mysql-shell主要是初始化集羣。這個包我是修改過名字的,根據實際執行
Mysql-shell下載地址:https://dev.mysql.com/downloads/shell/
2、docker-compose.yaml
注意:mysql-shell的官方版本只支持單主模式(可能是沒有搞清楚咋弄)
具體的參數意義可以參考
https://www.cnblogs.com/ll409546297/p/16919642.html
https://hub.docker.com/r/mysql/mysql-router
version: "2" services: xbd-cluster-1: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-1 restart: always container_name: xbd-cluster-1 volumes: - /var/lib/mysql/xbd-cluster-1:/var/lib/mysql ports: - 3306:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=1', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-1-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-1:33061', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=on', '--loose-group_replication_enforce_update_everywhere_checks=off', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'] xbd-cluster-2: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-2 restart: always container_name: xbd-cluster-2 volumes: - /var/lib/mysql/xbd-cluster-2:/var/lib/mysql ports: - 3307:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=2', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-2-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-2:33062', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=on', '--loose-group_replication_enforce_update_everywhere_checks=off', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'] xbd-cluster-3: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-cluster image: xbd-cluster-3 restart: always container_name: xbd-cluster-3 volumes: - /var/lib/mysql/xbd-cluster-3:/var/lib/mysql ports: - 3308:3306 environment: - TZ=Asia/Shanghai - MYSQL_ROOT_PASSWORD=root privileged: true command: ['--server-id=3', '--gtid_mode=ON', '--enforce_gtid_consistency=ON', '--master_info_repository=TABLE', '--relay_log_info_repository=TABLE', '--binlog_checksum=NONE', '--log_slave_updates=ON', '--log-bin=xbd-cluster-3-bin', '--binlog_format=ROW', '--transaction_write_set_extraction=XXHASH64', '--plugin_load_add=group_replication.so', '--loose-group_replication_group_name=aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '--loose-group_replication_start_on_boot=off', '--loose-group_replication_local_address=xbd-cluster-3:33063', '--loose-group_replication_group_seeds=xbd-cluster-1:33061,xbd-cluster-2:33062,xbd-cluster-3:33063', '--loose-group_replication_bootstrap_group=off', '--loose-group_replication_single_primary_mode=on', '--loose-group_replication_enforce_update_everywhere_checks=off', '--lower_case_table_names=1', '--character-set-server=utf8', '--collation-server=utf8_general_ci', '--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'] xbd-mysql-router: build: context: ./ dockerfile: ./config/Dockerfile/Dockerfile-router image: xbd-mysql-router restart: always container_name: xbd-mysql-router ports: - 6446:6446 - 6447:6447 environment: - TZ=Asia/Shanghai - MYSQL_HOST=xbd-cluster-1 - MYSQL_PORT=3306 - MYSQL_USER=root - MYSQL_PASSWORD=root - MYSQL_INNODB_CLUSTER_MEMBERS=3 privileged: true depends_on: - xbd-cluster-1 - xbd-cluster-2 - xbd-cluster-3
三、部署
1、build
2、運行mysql集羣
docker-compose up xbd-cluster-1 xbd-cluster-2 xbd-cluster-3 &
3、運行一個臨時的mysql-router,目的通過mysql-shell建立集羣
docker-compose run xbd-mysql-router /bin/bash
./mysql-shell/mysql-shell-8.0.19/bin/mysqlsh
執行以下腳本mysql-shell.script
shell.connect('[email protected]:3306'); var cluster = dba.createCluster('cluster'); cluster.addInstance('xbd-cluster-2:3306'); cluster.addInstance('xbd-cluster-3:3306'); cluster.status();
查看狀態
4、啓動mysql-router
docker-compose up xbd-mysql-router &
四、數據庫測試
SELECT * FROM `performance_schema`.replication_group_members;
到此搭建完成,並且集羣具備自動修復能力。
五、說一下,多主的配置,通過物理代理的形式也是可以達到代理的目的。
1、搭建MGR多主集羣
https://www.cnblogs.com/ll409546297/p/16919642.html
2、下載mysql-router
https://dev.mysql.com/downloads/router/
3、修改和配置
複製配置文件並修改
cp share/doc/mysqlrouter/sample_mysqlrouter.conf conf/mysqlrouter.conf
[DEFAULT] logging_folder = /usr/local/mysqlrouter/logs plugin_folder = /usr/local/mysqlrouter/lib/mysqlrouter config_folder = /usr/local/mysqlrouter/conf runtime_folder = /usr/local/mysqlrouter/run data_folder = /usr/local/mysqlrouter/lib/data keyring_path = /usr/local/mysqlrouter/lib/keyring-data master_key_path = /usr/local/mysqlrouterlib/keyring-key [logger] level = INFO[routing:cluster] bind_address = 0.0.0.0 bind_port = 3305 routing_strategy = first-available mode = read-write destinations = 192.168.5.14:3306,192.168.5.14:3307,192.168.5.14:3308
4、啓動
/usr/local/mysqlrouter/bin/mysqlrouter -c /usr/local/mysqlrouter/conf/mysqlrouter.conf
5、說明:這種方式可以代理多主的模式,但是不建議這種方式,還是推薦單主和docker的方式吧,可以配合K8S做容災處理。