galera 集群 - docker部署 mysql


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


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回