我试图创build一个与MariaDB自动部署的Galera集群,在CoreOS上运行Docker容器。
使用的软件: – MariaDB官方Docker镜像 ,版本10.1.10 – CoreOS 899.5.0,Docker 1.9.1
一切运行在2个独立的虚拟机上:10.2.0.4和10.2.0.5
我可以成功启动第一个节点(10.2.0.4)并引导集群。
但是,当我启动第二个节点时,我收到了mysql.time_zone_transition_type和mysql.time_zone_name表的复制错误。 之后, mysqld守护程序不会崩溃,所以我的Docker容器继续运行(运行几分钟没有问题),但似乎没有join集群(查询第一个节点上的状态只显示1个节点已join)它不接受任何连接(试图连接到该节点失败)。 奇怪的是,如果我重新启动Docker容器(保留数据文件夹),它就会join节点并且完美地工作。
以下是MySQLconfiguration文件(添加到Docker容器中的/etc/mysql/conf.d):
# this is read by the standalone daemon and embedded servers [server] # this is only for the mysqld standalone daemon [mysqld] # # * Galera-related settings # [galera] # Mandatory settings wsrep_on=ON wsrep_provider="/usr/lib/galera/libgalera_smm.so" wsrep_cluster_address="gcomm://10.2.0.4,10.2.0.5" binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_locks_unsafe_for_binlog=1 query_cache_size=0 query_cache_type=0 wsrep-sst-method=rsync # # Allow server to accept connections on all interfaces. # bind-address=0.0.0.0 # # Optional setting #wsrep_slave_threads=1 #innodb_flush_log_at_trx_commit=0 # this is only for embedded server [embedded] # This group is only read by MariaDB servers, not by MySQL. # If you use the same .cnf file for MySQL and MariaDB, # you can put MariaDB-only options here [mariadb] # This group is only read by MariaDB-10.1 servers. # If you use the same .cnf file for MariaDB of different versions, # use this group for options that older servers don't understand [mariadb-10.1]
我用以下方法启动第一个节点:
$ docker rm -f some-mariadb $ rm -rf /mnt/resource/data/* # Note: we need to pass the IP of the VM or mysqld will get the IP from the Docker container $ docker run \ --name some-mariadb \ -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \ -v /mnt/resource/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -d \ -p 3306:3306 \ -p 4567:4567/udp \ -p 4567-4568:4567-4568 \ -p 4444:4444 \ mariadb:10.1 \ --wsrep-new-cluster \ --wsrep_node_address=10.2.0.4
第二个与:
$ rm -rf /mnt/resource/data/* $ docker rm -f some-mariadb # Create a "/var/lib/mysql/mysql" folder so the Docker container won't initialize the db again (won't re-execute mysql_install_db) $ mkdir -p /mnt/resource/data/mysql $ docker run \ --name some-mariadb \ -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \ -v /mnt/resource/data:/var/lib/mysql \ -d \ -p 3306:3306 \ -p 4567:4567/udp \ -p 4567-4568:4567-4568 \ -p 4444:4444 \ mariadb:10.1 \ --wsrep_node_address=10.2.0.5
我的复制错误都是这样的:
2016-01-23 23:57:52 140131133560576 [ERROR] Slave SQL: Error 'Column 'Time_zone_id' cannot be null' on query. Default database: 'mysql'. Query: 'INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('Etc/GMT', @time_zone_id)', Internal MariaDB error code: 1048 2016-01-23 23:57:52 140131133560576 [Warning] WSREP: RBR event 1 Query apply warning: 1, 1536 2016-01-23 23:57:52 140131133560576 [Warning] WSREP: Ignoring error for TO isolated action: source: 09357a0e-c22d-11e5-963a-0a6f9b6b61c4 version: 3 local: 0 state: APPLYING flags: 65 conn_id: 5 trx_id: -1 seqnos (l: 1147, g: 1536, s: 1535, d: 1535, ts: 73713003335315)
完整的日志可以在这个链接find(这是4.2MB的!太大的职位)
再次请注意,一旦我在第二个节点(保存数据)中重新启动容器,复制就可以工作 – 并且运行良好! 但这个“奇怪的”启动过程是不正常的,我不能依靠它(我需要通过创buildfleet.d单位脚本整个设置,稍后)
经过几天的斗争,我终于能够得到这个工作。
关键问题是,默认的Docker镜像(可能模仿MySQL镜像的function)会在数据库中添加时区数据,无论出于何种原因(可能是因为它使用MyISAM表?),都会在此设置中导致严重的问题。
解决scheme:启动第一个节点时,将MYSQL_INITDB_SKIP_TZINFO=yes环境variables传递给Docker容器。 因此,启动第一个Docker容器的命令是:
docker run \ --name some-mariadb \ -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \ -v /mnt/resource/data:/var/lib/mysql \ -e MYSQL_INITDB_SKIP_TZINFO=yes \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -d \ -p 3306:3306 \ -p 4567:4567/udp \ -p 4567-4568:4567-4568 \ -p 4444:4444 \ mariadb:10.1 \ --wsrep-new-cluster \ --wsrep_node_address=10.2.0.4