MoHA 是 Mobike 开源的跨数据中心的 MySQL 集群的高可用(HA)解决方案

MoHA 提供了详细的设计和使用说明文档,点击查看

启动使用

下载项目

1
git clone https://gitee.com/piao/moha.git $GOPATH/src/github.com/moiot/moha

可选择修改配置中的账号密码,下面演示未修改,使用默认值

编译项目

1
2
3
cd $GOPATH/src/github.com/moiot/moha

make docker-agent

编译依赖Docker,需要先安装启动Docker

启动集群

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
github.com/moiot/moha/etc/docker-compose git:(master) ✗ > docker-compose -f docker-compose.yml up -d
Creating network "docker-compose_default" with the default driver
Creating volume "docker-compose_mysql-node-3-data" with default driver
Creating etcd-node-2    ... done
Creating haproxy-slave  ... done
Creating haproxy-master ... done
Creating etcd-node-1    ... done
Creating etcd-node-3    ... done
Creating etcd-node-0    ... done
Creating etcd-node-4    ... done
Creating pmm-server     ... done
Creating mysql-node-2   ... done
Creating mysql-node-1   ... done
Creating mysql-node-3   ... done

查看运行状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
github.com/moiot/moha/etc/docker-compose git:(master) ✗ > docker-compose -f docker-compose.yml ps
     Name                   Command               State                                                   Ports
---------------------------------------------------------------------------------------------------------------------------------------------------------------
etcd-node-0      /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:32768->2379/tcp, 2380/tcp
etcd-node-1      /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:32769->2379/tcp, 2380/tcp
etcd-node-2      /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:32770->2379/tcp, 2380/tcp
etcd-node-3      /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:32771->2379/tcp, 2380/tcp
etcd-node-4      /opt/bitnami/scripts/etcd/ ...   Up      0.0.0.0:32772->2379/tcp, 2380/tcp
haproxy-master   /docker-entrypoint.sh hapr ...   Up      0.0.0.0:5000->5000/tcp, 0.0.0.0:7000->7000/tcp
haproxy-slave    /docker-entrypoint.sh hapr ...   Up      0.0.0.0:5001->5000/tcp, 0.0.0.0:7001->7000/tcp
mysql-node-1     /agent/supervise                 Up      0.0.0.0:13307->13306/tcp, 0.0.0.0:3307->3306/tcp
mysql-node-2     /agent/supervise                 Up      0.0.0.0:13308->13306/tcp, 0.0.0.0:3308->3306/tcp
mysql-node-3     /agent/supervise                 Up      0.0.0.0:13309->13306/tcp, 0.0.0.0:3309->3306/tcp
pmm-server       /opt/entrypoint.sh               Up      0.0.0.0:3000->3000/tcp, 443/tcp, 0.0.0.0:8080->80/tcp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:9090->9090/tcp

浏览器访问监控数据

http://localhost:8080/

查看etcd目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> docker exec -it etcd-node-0 /bin/sh -c "etcdctl get / --prefix --keys-only"
/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/id

/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/last_gtid

/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/last_txnid

/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/last_uuid

/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/meta_version

/dbproxy/clustername/ks_cfg/nodes/node-test/election/master/term

/dbproxy/clustername/ks_cfg/nodes/node-test/election/terms/127.0.0.1:3307

/dbproxy/clustername/ks_cfg/nodes/node-test/election/terms/127.0.0.1:3308

/dbproxy/clustername/ks_cfg/nodes/node-test/election/terms/127.0.0.1:3309

/dbproxy/clustername/ks_cfg/nodes/node-test/master

/dbproxy/clustername/ks_cfg/nodes/node-test/slave/127.0.0.1:3307

/dbproxy/clustername/ks_cfg/nodes/node-test/slave/127.0.0.1:3308

查看mysql集群主节点

1
2
3
> docker exec -it etcd-node-0 /bin/sh -c "etcdctl get /dbproxy/clustername/ks_cfg/nodes/node-test/master"
/dbproxy/clustername/ks_cfg/nodes/node-test/master
127.0.0.1:3307

访问mysql集群主节点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
> docker exec -it mysql-node-1 /bin/bash
root@9936e9af59be:/# mysql -umysql_user -pmysql_master_user_pwd

[mysql_user@localhost][checker]> show grants;
+-----------------------------------------------------------------------------------------------------------------------+
| Grants for mysql_user@%                                                                                               |
+-----------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, RELOAD, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'mysql_user'@'%' |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

使用root账号访问mysql集群主节点

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS `mo_tbl`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `title` VARCHAR(100) NOT NULL,
   `author` VARCHAR(40) NOT NULL,
   `date` DATE,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建数据表并写入数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
> docker exec -it mysql-node-1 /bin/bash
root@9936e9af59be:/# mysql -uroot -pmaster_root_pwd

[root@localhost][checker]> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

[root@localhost][checker]> CREATE TABLE IF NOT EXISTS `mo_tbl`(
    ->    `id` INT UNSIGNED AUTO_INCREMENT,
    ->    `title` VARCHAR(100) NOT NULL,
    ->    `author` VARCHAR(40) NOT NULL,
    ->    `date` DATE,
    ->    PRIMARY KEY ( `id` )
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)

[root@localhost][checker]> desc mo_tbl;
+--------+------------------+------+-----+---------+----------------+
| Field  | Type             | Null | Key | Default | Extra          |
+--------+------------------+------+-----+---------+----------------+
| id     | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| title  | varchar(100)     | NO   |     | NULL    |                |
| author | varchar(40)      | NO   |     | NULL    |                |
| date   | date             | YES  |     | NULL    |                |
+--------+------------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

[root@localhost][checker]> insert into mo_tbl (title, author, date) values ("test", "piao", "2021-09-04");
Query OK, 1 row affected (0.01 sec)

[root@localhost][checker]> select * from mo_tbl;
+----+-------+--------+------------+
| id | title | author | date       |
+----+-------+--------+------------+
|  1 | test  | piao   | 2021-09-04 |
+----+-------+--------+------------+
1 row in set (0.00 sec)

参考