https://hub.docker.com/r/bitnami/mariadb-galera
https://github.com/bitnami/bitnami-docker-mariadb-galera/releases
https://hub.docker.com/_/mariadb
# docker
https://abc.htmltoo.com/thread-34911.htm
# Podman
https://abc.htmltoo.com/thread-46126.htm
# Proxysql 部署 - MySQL读写分离:
https://abc.htmltoo.com/thread-45875.htm
# Nuster - CDN部署:
https://abc.htmltoo.com/thread-44996.htm
mkdir -p /data/db/galera/galera{00,01,02,03,04}
mkdir -p /data/file/logs/galera/galera{00,01,02,03,04}
chmod -R 777 /data/db/galera/ /data/file/logs/percona/
#只有使用--subnet创建的网络才能指定静态IP
docker network create --driver bridge --subnet 172.33.0.0/24 --gateway 172.33.0.1 galera
docker run -itd --name galera00 \ --hostname galera00 \ --network galera \ -p 3360:3306 \ -e MARIADB_GALERA_CLUSTER_NAME=galera \ -e MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes \ -e MARIADB_GALERA_MARIABACKUP_USER=galera \ -e MARIADB_GALERA_MARIABACKUP_PASSWORD=wdqdmm@g \ -e MARIADB_ROOT_PASSWORD=wdqdmm@r \ -e MYSQL_ALLOW_EMPTY_PASSWORD=no \ -e MARIADB_EXTRA_FLAGS='--max-connect-errors=2000 --max_connections=20000' \ -e MARIADB_REPLICATION_USER=slave \ -e MARIADB_REPLICATION_PASSWORD=wdqdmm@s \ -e MARIADB_CHARACTER_SET=utf8mb4 \ -e MARIADB_COLLATE=utf8mb4_general_ci \ -e TIMEZONE=Asia/Shanghai \ -v /data/file:/data/file/ \ -v /data/docker/mysql/mariadb/my_custom.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf \ -v /data/db/galera/galera00:/bitnami/mariadb/data \ -v /data/file/logs/galera/galera00:/opt/bitnami/mariadb/logs \ --restart always -h galera00 --privileged=true --user=root bitnami/mariadb-galera
docker run -itd --name galera01 \ --hostname galera01 \ --network galera \ -p 3361:3306 \ -e MARIADB_GALERA_CLUSTER_NAME=galera \ -e MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567 \ -e MARIADB_GALERA_MARIABACKUP_USER=galera \ -e MARIADB_GALERA_MARIABACKUP_PASSWORD=wdqdmm@g \ -e MARIADB_ROOT_PASSWORD=wdqdmm@r \ -e MYSQL_ALLOW_EMPTY_PASSWORD=no \ -e MARIADB_EXTRA_FLAGS='--max-connect-errors=2000 --max_connections=20000' \ -e MARIADB_REPLICATION_USER=slave \ -e MARIADB_REPLICATION_PASSWORD=wdqdmm@s \ -e MARIADB_CHARACTER_SET=utf8mb4 \ -e MARIADB_COLLATE=utf8mb4_general_ci \ -e TIMEZONE=Asia/Shanghai \ -v /data/file:/data/file/ \ -v /data/docker/mysql/mariadb/my_custom.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf \ -v /data/db/galera/galera01:/bitnami/mariadb/data \ -v /data/file/logs/galera/galera01:/opt/bitnami/mariadb/logs \ --restart always -h galera01 --privileged=true --user=root bitnami/mariadb-galera
docker run -itd --name galera02 \ --hostname galera02 \ --network galera \ -p 3362:3306 \ -e MARIADB_GALERA_CLUSTER_NAME=galera \ -e MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567 \ -e MARIADB_GALERA_MARIABACKUP_USER=galera \ -e MARIADB_GALERA_MARIABACKUP_PASSWORD=wdqdmm@g \ -e MARIADB_ROOT_PASSWORD=wdqdmm@r \ -e MYSQL_ALLOW_EMPTY_PASSWORD=no \ -e MARIADB_EXTRA_FLAGS='--max-connect-errors=2000 --max_connections=20000' \ -e MARIADB_REPLICATION_USER=slave \ -e MARIADB_REPLICATION_PASSWORD=wdqdmm@s \ -e MARIADB_CHARACTER_SET=utf8mb4 \ -e MARIADB_COLLATE=utf8mb4_general_ci \ -e TIMEZONE=Asia/Shanghai \ -v /data/file:/data/file/ \ -v /data/docker/mysql/mariadb/my_custom.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf \ -v /data/db/galera/galera02:/bitnami/mariadb/data \ -v /data/file/logs/galera/galera02:/opt/bitnami/mariadb/logs \ --restart always -h galera02 --privileged=true --user=root bitnami/mariadb-galera
docker run -itd --name galera03 \ --hostname galera03 \ --network galera \ -p 3363:3306 \ -e MARIADB_GALERA_CLUSTER_NAME=galera \ -e MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567 \ -e MARIADB_GALERA_MARIABACKUP_USER=galera \ -e MARIADB_GALERA_MARIABACKUP_PASSWORD=wdqdmm@g \ -e MARIADB_ROOT_PASSWORD=wdqdmm@r \ -e MYSQL_ALLOW_EMPTY_PASSWORD=no \ -e MARIADB_EXTRA_FLAGS='--max-connect-errors=2000 --max_connections=20000' \ -e MARIADB_REPLICATION_USER=slave \ -e MARIADB_REPLICATION_PASSWORD=wdqdmm@s \ -e MARIADB_CHARACTER_SET=utf8mb4 \ -e MARIADB_COLLATE=utf8mb4_general_ci \ -e TIMEZONE=Asia/Shanghai \ -v /data/file:/data/file/ \ -v /data/docker/mysql/mariadb/my_custom.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf \ -v /data/db/galera/galera03:/bitnami/mariadb/data \ -v /data/file/logs/galera/galera03:/opt/bitnami/mariadb/logs \ --restart always -h galera03 --privileged=true --user=root bitnami/mariadb-galera
docker run -itd --name galera04 \ --hostname galera04 \ --network galera \ -p 3364:3306 \ -e MARIADB_GALERA_CLUSTER_NAME=galera \ -e MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567 \ -e MARIADB_GALERA_MARIABACKUP_USER=galera \ -e MARIADB_GALERA_MARIABACKUP_PASSWORD=wdqdmm@g \ -e MARIADB_ROOT_PASSWORD=wdqdmm@r \ -e MYSQL_ALLOW_EMPTY_PASSWORD=no \ -e MARIADB_EXTRA_FLAGS='--max-connect-errors=2000 --max_connections=20000' \ -e MARIADB_REPLICATION_USER=slave \ -e MARIADB_REPLICATION_PASSWORD=wdqdmm@s \ -e MARIADB_CHARACTER_SET=utf8mb4 \ -e MARIADB_COLLATE=utf8mb4_general_ci \ -e TIMEZONE=Asia/Shanghai \ -v /data/file:/data/file/ \ -v /data/docker/mysql/mariadb/my_custom.cnf:/opt/bitnami/mariadb/conf/my_custom.cnf \ -v /data/db/galera/galera04:/bitnami/mariadb/data \ -v /data/file/logs/galera/galera04:/opt/bitnami/mariadb/logs \ --restart always -h galera04 --privileged=true --user=root bitnami/mariadb-galera
---cnf
/opt/bitnami/mariadb/conf/my.cnf
/opt/bitnami/mariadb/conf/my_custom.cnf
docker exec -it galera00 /bin/bash
docker exec -it galera01 /bin/bash
docker exec -it galera02 /bin/bash
docker exec -it galera03 /bin/bash
docker exec -it galera04 /bin/bash
docker exec -it galera00 mysql -uroot -pwdqdmm@r -e"SHOW STATUS LIKE 'wsrep_cluster%';"
docker exec -it galera01 mysql -uroot -pwdqdmm@r -e"SHOW STATUS LIKE 'wsrep_cluster%';"
docker exec -it galera02 mysql -uroot -pwdqdmm@r -e"SHOW STATUS LIKE 'wsrep_cluster%';"
docker exec -it galera03 mysql -uroot -pwdqdmm@r -e"SHOW STATUS LIKE 'wsrep_cluster%';"
docker exec -it galera04 mysql -uroot -pwdqdmm@r -e"SHOW STATUS LIKE 'wsrep_cluster%';"
SHOW STATUS LIKE 'wsrep_cluster%';
SHOW VARIABLES LIKE 'wsrep_cluster_address';
# grastate.dat 说明
1)定位最近状态的节点
-当我们关闭一个节点时,其seqno会写入grastate.dat文件中,这时后续的seqno该节点将无法接收到
-注意数据库开启状态或者异常关闭时seqno值为-1
-当我们将所有节点关闭,准备重启时我们需要知道哪个节点是最后关闭的,并使用它来引导集群
-这时查看seqno的值即可,最大的即可
2)安全引导保护safe_to_bootstrap
-safe_to_bootstrap=1 的节点,说明这个节点是可以安全的作为主节点启动的。所以启动的时候必须先启动 89 节点。
-如果我们使用safe_to_bootstrao为0的节点来引导,数据库将无法启动
-一定要保证第一个启动的是包含最新数据的节点!
-我们可以手动编辑该文件将值设置为1来引导,不过这样可能会造成数据丢失
-如果所有节点同时异常宕机,这时所有节点的值都为0,需要选择一台手动编辑
3)定位崩溃的节点
同样我们可以使用该文件来定位哪些节点异常崩溃的
如果seqno为-1则说明数据库正在运行,或者非正常关闭
我们可以重新启动他,Galera集群会自动恢复并同步数据
# 注意: 节点全部异常和正常关闭的启动顺序
docker stop galera01 galera02 galera03 galera04
docker stop galera00
cd /data/db/galera/galera00/grastate.dat
safe_to_bootstrap: 1
docker start galera00
docker start galera01 galera02 galera03 galera04
# gcomm 说明
---节点是否是群集的第一个节点
MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes
"gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。
如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改
"gcomm://"为其他节点的集群地址,例如
wsrep_cluster_address="gcomm://192.168.0.172:4567"
#修改节点的wsrep_cluster_address
set global wsrep_cluster_address="gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567";
grep -q "wsrep_cluster_address=gcomm://" /opt/bitnami/mariadb/conf/my.cnf || cat >> /opt/bitnami/mariadb/conf/my.cnf << EOF
########################################
wsrep_cluster_address=gcomm://galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567
EOF
sed -i 's/.*wsrep_cluster_address=gcomm:\/\//wsrep_cluster_address=gcomm:\/\/galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567/' /opt/bitnami/mariadb/conf/my.cnf
sed -i 's/.*wsrep_cluster_address=gcomm:\/\/galera00:4567,galera01:4567,galera02:4567/wsrep_cluster_address=gcomm:\/\/galera00:4567,galera01:4567,galera02:4567,galera03:4567,galera04:4567/' /opt/bitnami/mariadb/conf/my.cnf
-查看MySQL版本
SHOW GLOBAL VARIABLES LIKE 'version';
-查看wsrep版本
SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';
-查看wsrep有关的所有变量
SHOW VARIABLES LIKE 'wsrep%' \G
-查看Galera集群状态
show status like 'wsrep%';
#监控状态参数说明:
---集群完整性检查:
-wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.
-wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时"分区"了.当节点之间网络连接恢复的时候应该会恢复一样的值.
-wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.
-wsrep_cluster_status:集群组成的状态.如果不为"Primary",说明出现"分区"或是"split-brain"状况.
---节点状态检查:
-wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.
-wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)
-wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.
---复制健康检查:
-wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.
-wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.
-wsrep_flow_control_sent:表示该节点已经停止复制了多少次.
-wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.
-最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.
---检测慢网络问题:
-wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶
---冲突或死锁的数目:
-wsrep_last_committed:最后提交的事务数目
-wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目
docker stop galera00 galera01 galera02 galera03 galera04 galera05 galera06 galera07 galera08
docker rm galera00 galera01 galera02 galera03 galera04 galera05 galera06 galera07 galera08
rm -rf /data/db/galera/galera0*/* /data/file/logs/galera/galera0*/*
vim /data/docker/mysql/mariadb/my_custom.cnf
[mysqld] #skip-grant-tables default-storage-engine = innodb max_allowed_packet=800M #是否对sql语句大小写敏感,1表示不敏感 lower_case_table_names = 1 interactive_timeout = 1800 wait_timeout = 1800 log_error = /opt/bitnami/mariadb/logs/mariadb-error.log long_query_time = 10 slow_query_log_file = /opt/bitnami/mariadb/logs/mariadb-slow.log binlog_format = row log_bin = /opt/bitnami/mariadb/logs/mysql-bin.log expire_logs_days = 2 max_binlog_size = 800M
galera00: /data/docker/mysql/mariadb/my.cnf
[galera] wsrep_on=ON wsrep_provider=/opt/bitnami/mariadb/lib/libgalera_smm.so wsrep_sst_method=mariabackup wsrep_slave_threads=4 wsrep_cluster_address=gcomm:// wsrep_sst_auth=galera:wdqdmm@g wsrep_cluster_name=galera wsrep_node_name=galera00 wsrep_node_address=172.33.0.2
galera01: /data/docker/mysql/mariadb/my.cnf
[galera] wsrep_on=ON wsrep_provider=/opt/bitnami/mariadb/lib/libgalera_smm.so wsrep_sst_method=mariabackup wsrep_slave_threads=4 wsrep_cluster_address=gcomm://galera00:4567,galera01:4567,galera02:4567 wsrep_sst_auth=galera:wdqdmm@g wsrep_cluster_name=galera wsrep_node_name=galera01 wsrep_node_address=172.33.0.3
https://blog.csdn.net/tianlianchao1982/article/details/41676613