
severalnines/mariadb该镜像包含MariaDB 10.1(支持Galera)及其所有组件: * MariaDB客户端包 * Percona Xtrabackup * jq - 轻量级灵活的命令行JSON处理器 * report_status.sh - 每隔`TTL`时间向etcd报告Galera状态 * healthcheck.sh## 运行容器Docker镜像接受以下参数: * 必须定义`MYSQL_ROOT_PASSWORD` * 镜像会为XtraBackup SST方法创建`xtrabackup@localhost`用户。若需为该用户设置密码,可通过`XTRABACKUP_PASSWORD`指定 * 若使用发现服务(目前仅支持`etcd`),通过`DISCOVERY_SERVICE`设置地址(ip:port格式),可接受逗号分隔的多个地址。镜像会通过`CLUSTER_NAME`自动查找运行中的集群并加入(或启动新集群) * 若不使用发现服务,可使用`CLUSTER_JOIN`变量。空值将启动新集群;若需加入现有集群,将其设为集群节点IP地址列表 * 默认`TTL`为30秒。容器在正常运行(wsrep_cluster_state_comment=Synced)时,会通过`report_status.sh`每隔`TTL - 2`秒报告状态。若容器宕机,将停止向etcd更新,键(wsrep_cluster_state_comment)会在过期后被移除,表明该节点不再与集群同步,构建Galera通信地址时将被跳过 建议至少运行3个容器以实现高可用,也可通过标准`docker run`命令运行独立节点。### Docker Engine Swarm Mode#### 临时存储假设: * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群(临时存储):```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb ```#### 持久存储假设: * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群(持久存储):```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --mount type=volume,source=galera-vol,destination=/var/lib/mysql \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb ```#### 自定义my.cnf假设: * 所有Docker主机上存在`/mnt/docker/mysql-config`目录用于数据卷映射,自定义`my.cnf`需放置于此目录 * etcd集群运行在192.168.55.111:2379、192.168.55.112:2379、192.168.55.113:2379 * 已创建名为`galera-net`的覆盖网络 在Docker Swarm模式下运行三节点MariaDB Galera集群:```bash $ docker service create \ --name mariadb-galera \ --replicas 3 \ -p 3306:3306 \ --network galera-net \ --mount type=volume,source=galera-vol,destination=/var/lib/mysql \ --mount type=bind,src=/mnt/docker/mysql-config,dst=/etc/my.cnf.d \ --env MYSQL_ROOT_PASSWORD=mypassword \ --env DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ --env XTRABACKUP_PASSWORD=mypassword \ --env CLUSTER_NAME=my_wsrep_cluster \ severalnines/mariadb
验证命令:```bash $ docker service ps mariadb-galera
外部应用/客户端可通过任何Docker主机IP或主机名的3306端口连接,请求会在Galera容器间负载均衡。连接通过Linux内核内置的IPVS负载均衡功能NAT到每个服务"任务"(即容器)的虚拟IP。若应用容器与Galera在同一覆盖网络(galera-net)中,可使用分配的虚拟IP,通过以下命令获取:```bash $ docker service inspect mariadb-galera -f "{{ .Endpoint.VirtualIPs }}"
或在同一网络的容器中ping服务名:bash $ ping mariadb-galera ### Kubernetes即将推出。### 无编排工具运行独立Galera节点命令:```bash
$ docker run -d
-p 3306
--name=galera
-e MYSQL_ROOT_PASSWORD=mypassword
-e DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379
-e CLUSTER_NAME=my_wsrep_cluster
-e XTRABACKUP_PASSWORD=mypassword
severalnines/mariadb
创建三节点Galera集群示例:```bash $ for i in 1 2 3; do \ docker run -d \ -p 3306 \ --name=galera${i} \ -e MYSQL_ROOT_PASSWORD=mypassword \ -e DISCOVERY_SERVICE=192.168.55.111:2379,192.168.55.112:2379,192.168.55.113:2379 \ -e CLUSTER_NAME=my_wsrep_cluster \ -e XTRABACKUP_PASSWORD=mypassword \ severalnines/mariadb; done
验证命令:bash $ docker ps ## 构建镜像如需构建Docker镜像,下载GitHub仓库中的Docker相关文件:```bash
$ git clone [***]
$ cd galera-docker-mariadb
$ docker build -t --rm=true severalnines/mariadb .
验证命令:```bash $ docker images ```## 发现服务所有节点应定期向etcd报告状态,使用带过期时间的键。默认`TTL`为30秒,容器在正常运行(wsrep_cluster_state_comment=Synced)时,通过`report_status.sh`每隔`TTL - 2`秒报告状态。若容器宕机,停止更新etcd,键(wsrep_cluster_state_comment)过期后被移除,表明节点不再与集群同步,构建Galera通信地址时将被跳过。 通过etcd查看运行节点列表(假设CLUSTER_NAME="my_wsrep_cluster"):```javascript $ curl -s "[***]" | python -m json.tool { "action": "get", "node": { "createdIndex": ***, "dir": true, "key": "/galera/my_wsrep_cluster", "modifiedIndex": ***, "nodes": [ { "createdIndex": ***, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.6", "modifiedIndex": ***, "nodes": [ { "createdIndex": ***, "expiration": "2016-11-29T10:55:35.37622336Z", "key": "/galera/my_wsrep_cluster/10.255.0.6/wsrep_last_committed", "modifiedIndex": ***, "ttl": 10, "value": "0" }, { "createdIndex": ***, "expiration": "2016-11-29T10:55:34.788170259Z", "key": "/galera/my_wsrep_cluster/10.255.0.6/wsrep_local_state_comment", "modifiedIndex": ***, "ttl": 10, "value": "Synced" } ] }, { "createdIndex": ***, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.7", "modifiedIndex": ***, "nodes": [ { "createdIndex": ***, "key": "/galera/my_wsrep_cluster/10.255.0.7/ipaddress", "modifiedIndex": ***, "value": "10.255.0.7" }, { "createdIndex": ***, "expiration": "2016-11-29T10:55:35.218496083Z", "key": "/galera/my_wsrep_cluster/10.255.0.7/wsrep_last_committed", "modifiedIndex": ***, "ttl": 10, "value": "0" }, { "createdIndex": ***, "expiration": "2016-11-29T10:55:34.650574629Z", "key": "/galera/my_wsrep_cluster/10.255.0.7/wsrep_local_state_comment", "modifiedIndex": ***, "ttl": 10, "value": "Synced" } ] }, { "createdIndex": ***, "dir": true, "key": "/galera/my_wsrep_cluster/10.255.0.8", "modifiedIndex": ***, "nodes": [ { "createdIndex": ***, "expiration": "2016-11-29T10:55:39.681757381Z", "key": "/galera/my_wsrep_cluster/10.255.0.8/wsrep_last_committed", "modifiedIndex": ***, "ttl": 15, "value": "0" }, { "createdIndex": ***, "expiration": "2016-11-29T10:55:38.638268679Z", "key": "/galera/my_wsrep_cluster/10.255.0.8/wsrep_local_state_comment", "modifiedIndex": ***, "ttl": 14, "value": "Synced" } ] } ] } } ```## 已知限制* 镜像在Docker 1.12.3版本(build 6b644ec)和CentOS 7.1环境下测试构建。 * 发生脑裂(所有节点处于Non-Primary状态)时无自动恢复机制。这是因为MySQL服务仍在运行但拒绝提供数据并向客户端返回错误,Docker仅关注前台MySQL进程是否终止,无法检测此状态。自动恢复存在风险(尤其当服务发现与Docker主机共置时)。若外部服务发现健康,需手动干预:选择最先进的节点引导,执行以下命令将其提升为Primary(网络恢复后其他节点会自动重新加入):```bash $ docker exec -it [container] mysql -uroot -pyoursecret -e 'set global wsrep_provider_options="pc.bootstrap=1"'
或使用etcdctl命令:```bash $ etcdctl rm /galera/my_wsrep_cluster --recursive ```## 开发请通过Github创建issue,或通过支持渠道[***]

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务