
w303972870/mariadb-galera该镜像是基于源码编译的MariaDB版本,组件齐全,专为xtrabackup集群设计。内置Sphinx全文搜索引擎、MariaDB-Galera集群组件及xtrabackup备份工具,适用于构建高可用数据库集群环境。镜像体积较大,后续将进行精简优化。
docker-entrypoint-initdb.d目录执行初始化脚本(.sh、.sql、.sql.gz文件)适用于需要构建高可用MariaDB集群的场景,尤其是需要使用xtrabackup进行备份恢复、依赖Galera实现数据同步的企业级数据库环境。
bashdocker pull w303972870/mariadb-galera
初始化数据库(首次启动需指定root密码):
bashdocker run -dit -p 3306:3306 -p 4567:4567 -p 4568:4568 -p 4444:4444 \ -v /data/mariadb/:/data/ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_HOST=192.168.12.% -e MYSQL_ROOT_PASSWORD=*** \ docker.io/w303972870/mariadb-galera
| 变量 | 解释 |
|---|---|
| MYSQL_ROOT_HOST | 设置root用户允许访问的主机,格式为'root'@'${MYSQL_ROOT_HOST}' |
| MYSQL_ROOT_PASSWORD | 设置root用户密码,与MYSQL_ROOT_HOST配合使用 |
| MYSQL_RANDOM_ROOT_PASSWORD | 随机生成root密码 |
| MYSQL_INITDB_SKIP_TZINFO | 不导入时区信息到MySQL,默认导入 |
| MYSQL_DATABASE | 默认创建指定名称的数据库 |
| MYSQL_USER | 新建数据库用户 |
| MYSQL_PASSWORD | 新建用户的密码 |
| WSREP_NEW_CLUSTER | 集群初始化参数,启动集群第一台时设为yes,其他节点不设或设为no |
| SKIP_INIT_SCRIPT | 跳过初始化脚本,直接启动MySQL,集群非第一台节点需使用此参数 |
首次启动需初始化数据库,先不启用Galera集群:
bashdocker run -dit -p 3306:3306 --net host -p 4567:4567 -p 4568:4568 -p 4444:4444 \ -v /data/mariadb-galera/:/data/ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_HOST=172.17.0.% -e MYSQL_ROOT_PASSWORD=*** \ docker.io/w303972870/mariadb-galera
初始化完成后,进入容器配置访问权限:
bashmysql -h 127.0.0.1 -p3306 -u root -p***
执行授权命令:
sqlGRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.12.%' IDENTIFIED BY '***' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '***' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.%' IDENTIFIED BY '***' WITH GRANT OPTION; FLUSH PRIVILEGES;
停止步骤1的容器,修改/data/etc/my.cnf,设置wsrep_on=1,启动时添加集群初始化参数:
bashdocker run -dit -p 3306:3306 --net host -p 4567:4567 -p 4568:4568 -p 4444:4444 \ -v /data/mariadb-galera/:/data/ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_HOST=172.17.0.% -e MYSQL_ROOT_PASSWORD=*** -e WSREP_NEW_CLUSTER=yes \ docker.io/w303972870/mariadb-galera
无需初始化,直接启动并加入集群,使用SKIP_INIT_SCRIPT=yes跳过初始化:
bashdocker run -dit -p 3306:3306 --net host -p 4567:4567 -p 4568:4568 -p 4444:4444 \ -v /data/mariadb-galera/:/data/ -v /etc/localtime:/etc/localtime \ -e MYSQL_ROOT_HOST=172.17.0.% -e MYSQL_ROOT_PASSWORD=*** -e SKIP_INIT_SCRIPT=yes \ docker.io/w303972870/mariadb-galera
容器数据卷挂载路径/data/mariadb-galera/的目录结构如下(需确保权限正确):
/data/mariadb-galera/ ├── database # 数据目录 ├── galera # Galera相关文件 ├── bin-logs # 二进制日志目录 ├── docker-entrypoint-initdb.d # 初始化脚本目录(支持.sh、.sql、.sql.gz) ├── etc # 配置文件目录 │ └── my.cnf # 默认配置文件 └── logs # 日志目录
docker-entrypoint-initdb.d目录支持执行以下类型文件:
.sh:直接执行shell脚本.sql:执行SQL脚本.sql.gz:解压并执行SQL脚本执行逻辑:
bashfor f in /data/docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; execute < "$f"; echo ;; *.sql.gz) echo "$0: running $f"; gunzip -c "$f" | execute; echo ;; *) echo "$0: ignoring $f" ;; esac echo done
默认配置文件路径:/data/etc/my.cnf,以下是基本配置示例(Galera集群相关配置需根据实际环境调整):
ini[client] port= 3306 socket = /data/database/mysql.sock default-character-set = utf8mb4 [mysqld] port= 3306 socket = /data/database/mysql.sock datadir = /data/database/ pid-file = /data/database/mysql.pid user = mysql server-id = 1 bind-address=0.0.0.0 character-set-server = utf8mb4 skip-name-resolve # Galera集群配置 wsrep_on=1 wsrep_provider="/usr/lib64/galera/libgalera_smm.so" wsrep_cluster_name=eric_cluster wsrep_provider_options="pc.ignore_sb=true;pc.ignore_quorum=true;gcache.size=5G;gcache.name=/data/galera/galera.cache" wsrep_cluster_address="gcomm://192.168.12.2,192.168.12.3,192.168.12.4" wsrep_slave_threads=16 wsrep_node_name='manager-node' wsrep_node_address='192.168.12.2' wsrep_sst_method=mariabackup wsrep_sst_auth="root:***"
执行show ENGINES;可查看支持的存储引擎,包括InnoDB(默认)、SPHINX、MyISAM等:
| Engine | Support | Transactions | XA | Savepoints |
|---|---|---|---|---|
| MRG_MyISAM | YES | NO | NO | NO |
| MyISAM | YES | NO | NO | NO |
| InnoDB | DEFAULT | YES | YES | YES |
| SPHINX | YES | NO | NO | NO |
可通过wsrep-notify.sh脚本监控集群状态,创建wsrep.membership和wsrep.status表记录节点信息和状态变化。脚本示例:
bash#!/bin/sh -eu USER=root PSWD=*** HOST=192.168.12.2 PORT=3306 SCHEMA="wsrep" MEMB_TABLE="$SCHEMA.membership" STATUS_TABLE="$SCHEMA.status" BEGIN=" SET wsrep_on=0; DROP SCHEMA IF EXISTS $SCHEMA; CREATE SCHEMA $SCHEMA; CREATE TABLE $MEMB_TABLE ( idx INT UNIQUE PRIMARY KEY, uuid CHAR(40) UNIQUE, /* node UUID */ name VARCHAR(32), /* node name */ addr VARCHAR(256) /* node address */ ) ENGINE=MEMORY; CREATE TABLE $STATUS_TABLE ( size INT, /* component size */ idx INT, /* this node index */ status CHAR(16), /* this node status */ uuid CHAR(40), /* cluster UUID */ prim BOOLEAN /* if component is primary */ ) ENGINE=MEMORY; BEGIN; DELETE FROM $MEMB_TABLE; DELETE FROM $STATUS_TABLE; " END="COMMIT;" configuration_change() { echo "$BEGIN;" local idx=0 for NODE in $(echo $MEMBERS | sed s/,/\ /g) do echo "INSERT INTO $MEMB_TABLE VALUES ( $idx, " echo "'$NODE'" | sed s/\\//\',\'/g echo ");" idx=$(( $idx + 1 )) done echo " INSERT INTO $STATUS_TABLE VALUES($idx, $INDEX,'$STATUS', '$CLUSTER_UUID', $PRIMARY); " echo "$END" } status_update() { echo " SET wsrep_on=0; BEGIN; UPDATE $STATUS_TABLE SET status='$STATUS'; COMMIT; " } COM=status_update # not a configuration change by default while [ $# -gt 0 ] do case $1 in --status) STATUS=$2 shift ;; --uuid) CLUSTER_UUID=$2 shift ;; --primary) [ "$2" = "yes" ] && PRIMARY="1" || PRIMARY="0" COM=configuration_change shift ;; --index) INDEX=$2 shift ;; --members) MEMBERS=$2 shift ;; esac shift done if [ "$STATUS" != "Undefined" ] then $COM | mysql -B -u$USER -p$PSWD -h$HOST -P$PORT fi exit 0
wsrep_cluster_address需填写所有节点IP
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务