0. 前言

由于GreatSQL 8.0.27版本中引入MGR仲裁节点(投票节点,ARBITRATOR)特性,MySQL提供的mysql-shell无法识别该特性,因此提供mysql-shell for GreatSQL版本。

1. 修改说明

需要修改mysql-shell源码,增加对仲裁节点(投票节点)角色类型的支持,涉及到两个文件:

  • mysqlshdk/libs/mysql/group_replication.h
  • mysqlshdk/libs/mysql/group_replication.cc

    Member_role 对象中增加 ARBITRATOR 角色类型即可。整个patch文件只有35行,很简单:
$ cat mysqlsh-for-greatsql-8.0.27.patch

diff --git a/mysqlshdk/libs/mysql/group_replication.cc b/mysqlshdk/libs/mysql/group_replication.cc
index ef6a8e1b9..9edbab628 100644
--- a/mysqlshdk/libs/mysql/group_replication.cc
+++ b/mysqlshdk/libs/mysql/group_replication.cc
@@ -108,6 +108,8 @@ std::string to_string(const Member_role role) {
return "PRIMARY";
case Member_role::SECONDARY:
return "SECONDARY";
+ case Member_role::ARBITRATOR:
+ return "ARBITRATOR";
case Member_role::NONE:
return "NONE";
}
@@ -119,6 +121,8 @@ Member_role to_member_role(const std::string &role) {
return Member_role::PRIMARY;
} else if (shcore::str_casecmp("SECONDARY", role.c_str()) == 0) {
return Member_role::SECONDARY;
+ } else if (shcore::str_casecmp("ARBITRATOR", role.c_str()) == 0) {
+ return Member_role::ARBITRATOR;
} else if (role.empty()) {
return Member_role::NONE;
} else {
diff --git a/mysqlshdk/libs/mysql/group_replication.h b/mysqlshdk/libs/mysql/group_replication.h
index c76385e4b..1d957eae5 100644
--- a/mysqlshdk/libs/mysql/group_replication.h
+++ b/mysqlshdk/libs/mysql/group_replication.h
@@ -73,7 +73,7 @@ enum class Member_state {
MISSING
}; -enum class Member_role { PRIMARY, SECONDARY, NONE };
+enum class Member_role { PRIMARY, SECONDARY, ARBITRATOR, NONE }; enum class Topology_mode { SINGLE_PRIMARY, MULTI_PRIMARY, NONE };

2. 编译mysql-shell

从MySQL官网下载的mysql-shell 8.0.27源码包是有问题的,会导致编译失败,需要自己手动修改 CMakeLists.txt 文件。我已经提交bug(#106730)了,升级到8.0.28就可以了。

官方提供的参考文档 https://github.com/mysql/mysql-shell/blob/master/INSTALL 版本太老了(最后更新时间 Aug 19, 2020),几乎完全不可用。

只好我自己摸索了。

2.1 环境准备

下载几个相关的安装包:

利用下面的Dockerfile构建一个CentOS 8的docker镜像,专门用于编译mysql-shell:

FROM docker.io/arm64v8/centos

RUN rm -f /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Linux-AppStream.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo && \
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y epel-release && \
yum clean all && \
yum makecache
RUN yum install -y --skip-broken yum-utils wget diffutils net-tools vim git gcc gcc-c++ automake libtool cmake cmake3 \
make psmisc openssl openssl-devel zlib-devel readline-devel bzip2-devel expat-devel \
bison flex wget unzip libcurl-devel libevent-devel libffi-devel lz4-devel \
file clang bzip2 libxml2-devel libtirpc libtirpc-devel numactl-devel numactl-libs \
numactl openldap-devel openldap-clients pam-devel valgrind boost-devel \
libzstd libzstd-devel patchelf perl perl-Env perl-JSON perl-Memoize perl-Time-HiRes time libaio-devel libarchive \
ncurses-devel ncurses-libs pam redhat-lsb-core scl-utils-build pkg-config ccache \
jemalloc jemalloc-devel libicu-devel re2-devel redhat-lsb-core rpm* tar libssh \
cyrus-sasl-devel cyrus-sasl-scram python36 python36-devel RUN dnf install -y dnf
RUN dnf install -y gcc-toolset-10 && source /opt/rh/gcc-toolset-10/enable
RUN echo 'source /opt/rh/gcc-toolset-10/enable' >> /root/.bash_profile #patchelf
COPY patchelf-0.14.5.tar.gz /tmp/ #rpcsvc-proto
COPY rpcsvc-proto-1.4.tar.gz /tmp/rpcsvc-proto-1.4.tar.gz COPY boost_1_73_0.tar.gz /opt/ RUN rm -fr /tmp/*

接下来就是制作docker镜像包,然后再启动一个docker容器,详细过程方法可参考这篇文章:自制GreatSQL Docker镜像

启动容器后,将之前下载的几个安装包都拷贝到容器中的 /opt/ 目录下并解压缩:

drwxr-xr-x  8 root   root      65536 Apr 22  2020 boost_1_73_0
-rw------- 1 root root 128699082 Dec 7 08:34 boost_1_73_0.tar.gz
drwxr-xr-x 31 7161 31415 65536 Mar 15 06:30 mysql-8.0.27
-rw-r--r-- 1 root root 285550905 Mar 15 06:12 mysql-8.0.27.tar.gz
drwxr-xr-x 17 root root 65536 Mar 15 07:12 mysql-shell-8.0.27-src
-rw-r--r-- 1 root root 81013338 Mar 15 06:12 mysql-shell-8.0.27-src.tar.gz
-rw-r--r-- 1 root root 1372 Mar 15 06:12 mysqlsh-for-greatsql-8.0.27.patch
-rw-r--r-- 1 root root 313132 Mar 16 09:26 patchelf-0.14.5-x86_64.tar.gz
drwxr-xr-x 18 411487 89939 65536 Mar 15 07:00 protobuf-3.11.4
-rw-r--r-- 1 root root 7408292 Mar 15 06:12 protobuf-all-3.11.4.tar.gz
drwxr-xr-x 3 root root 28 Mar 15 06:01 rh
drwxr-xr-x 4 1000 users 65536 Mar 15 06:29 rpcsvc-proto-1.4
-rw-r--r-- 1 root root 149354 Dec 7 08:23 rpcsvc-proto-1.4.tar.gz

接下来先编译安装几个依赖包:

$ cd /opt/protobuf-3.11.4
./autogen.sh && ./configure && make && make install $ cd /opt/rpcsvc-proto-1.4
./configure && make && make install

2.2 开始编译mysql & mysql-shell

复制执行下面的命令,一次性完成mysql & mysql-shell编译安装:

cd /opt/mysql-8.0.27 && \
rm -fr bld && \
mkdir bld && \
cd bld && \
cmake .. -DBOOST_INCLUDE_DIR=/opt/boost_1_73_0/ \
-DLOCAL_BOOST_DIR=/opt/boost_1_73_0/ \
-DWITH_SSL=system && \
cmake --build . --target mysqlclient; \
cmake --build . --target mysqlxclient && \
cd /opt/mysql-shell-8.0.27-src && \
rm -fr bld && \
mkdir bld && \
cd bld && \
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64 \
-DMYSQL_SOURCE_DIR=/opt/mysql-8.0.27 \
-DMYSQL_BUILD_DIR=/opt/mysql-8.0.27/bld/ \
-DHAVE_PYTHON=1 -DWITH_PROTOBUF=bundled && \
make -j64 && make install

编译完成后,会把二进制文件安装到 /usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64 目录下。

2.3 利用patchelf修改mysqlsh二进制文件

编译安装完毕后,执行下面的命令,查看 mysqlsh 二进制文件的依赖关系是否都正常,会发现其中有个so依赖文件找不到:

$ cd /usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64
$ ldd bin/mysqlsh
linux-vdso.so.1 (0x00007ffd3adce000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f96f73a8000)
...
libprotobuf.so.22 => not found
...

这是因为 libprotobuf.so.22 这个动态库文件在 /usr/local/lib/ 目录下,所以找不到。

这时候,我们可以利用 patchelf 修改 mysqlsh 文件,将依赖路径从绝对路径方式改成相对路径方式:

- 首先,新建一个目录
$ pwd
/usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64
$ mkdir -p lib/private
- 将 libprotobuf 动态库文件拷贝过来
$ cp /usr/local/lib/libprotobuf.so.22.0.4 lib/private
- 做一个软链接
$ cd lib/private/
$ ln -s libprotobuf.so.22.0.4 libprotobuf.so.22
- 再利用patchelf修改mysqlsh
cd /usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64
$ patchelf --set-rpath '$ORIGIN/../lib/private' ./bin/mysqlsh
$ ldd bin/mysqlsh
cd ../..
[root@mysqlsh-c8 mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64]# ldd bin/mysqlsh
linux-vdso.so.1 (0x00007ffec77e1000)
...
libprotobuf.so.22 => /usr/local/mysql-shell-8.0.27-18-Linux-glibc2.28-x86_64/bin/../lib/private/libprotobuf.so.22 (0x00007f2b8a5db000)

可以看到,mysqlsh 能找到 libprotobuf 这个动态库文件了,也就可以正常使用了。

3. 运行mysql-shell for GreatSQL

如果想要让mysql-shell支持JavaScript语法,需要再编译时加上 libv8,但其难度太大了,我表示直接放弃。。。

虽然不支持js语法,但还是支持Python语法的呀,略有不同而已,下面举几个常见的例子作为参照对比:

js语法 py语法
$ var c=dba.getCluster() $c=dba.get_cluster()
c.status() c.statsu()
c.setPrimaryInstance() c.set_primary_instance()
c.switchToMultiPrimaryMode() c.switch_to_multi_primary_mode()
c.rebootClusterFromCompleteOutage() c.reboot_cluster_from_complete_outage()

看到了吧,其实也就是语法风格略有不同而已,没什么本质区别。

接下来可以玩转GreatSQL 8.0.27的仲裁节点新功能了:

 MySQL  172.16.16.12:33060+ ssl  Py > c.status()
{
"clusterName": "GreatSQL8027",
"defaultReplicaSet": {
"name": "default",
"primary": "172.16.16.12:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"172.16.16.10:3306": {
"address": "172.16.16.10:3306",
"memberRole": "ARBITRATOR", <-- 仲裁节点
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
},
"172.16.16.11:3306": {
"address": "172.16.16.11:3306",
"memberRole": "SECONDARY", <-- Secondary节点
"mode": "R/O",
"readReplicas": {},
"replicationLag": "00:00:00.001422",
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
},
"172.16.16.12:3306": {
"address": "172.16.16.12:3306",
"memberRole": "PRIMARY", <-- Primary节点
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.27"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "172.16.16.12:3306"
}

对了,第一次启动mysqlsh时,可能会有类似下面的提示:

WARNING: Found errors loading plugins, for more details look at the log at: /root/.mysqlsh/mysqlsh.log

只要执行下面的指令安装certifi这个Python模块即可:

$ pip3.6 install --user certifi

好了,开始感受MGR仲裁节点的魅力吧 O(∩_∩)O哈哈~

P.S1:这是老叶临时抱佛脚的应急版本,可能还有诸多不完善的地方,后面会推出正式的版本。

PS2:GreatSQL 8.0.27及5.7.36版本很快就会发布,请耐心等待。另外,如果是想使用MGR的话,强烈建议选用8.0版本,不要使用5.7版本,8.0的MGR在功能和可靠性方面都要比5.7好太多。

本文完。

Enjoy GreatSQL

mysql-shell for GreatSQL 8.0.27编译安装及使用的更多相关文章

  1. Shell脚本一键部署——源码编译安装MySQL及自动补全工具

    Shell脚本一键部署--源码编译安装MySQL及自动补全工具 编译安装MySQL 1.软件包 Mysql安装包 将安装包拖至/opt目录下,编辑一个脚本文件,将以下内容复制进去,然后source或者 ...

  2. 在CUDA8.0下编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0(网上有 ...

  3. linux下Mysql 8.0.19 编译安装

    1 前言 linux下安装MySQL的方式有很多种,包括以仓库的方式安装(yum,apt,zypper),以包的方式安装(rpm,deb),以docker方式安装,从压缩包解压安装,从源码编译安装,这 ...

  4. 一文吃透zabbix4.0的编译安装,最全最详细的安装。

    什么是zabbix? zabbix作为一款企业级,开源的,分布式的监控套件,解决了以往监控软件的短板,可以说是现在流行的监控解决方案之一. 监控系统的理想化模样 1.监控数据收集及可视化. 2.数据要 ...

  5. hadoop-2.2.0 的编译安装及HA配置

    一 准备工作 准备工作中要求有 1.centOs 6.4,添加hadoop用户,配置集群内的/etc/hosts文件. 2.安装hadoop用户的ssh,并打通集群内所有机器,(ha执行fencing ...

  6. Mapnik 3.0.20编译安装

    1. 确定epel安装 yum install -y epel-release 2. 按照<CentOS7.2部署node-mapnik>一文中的步骤,手动安装 gcc-6.2.0 和 b ...

  7. hadoop2.2.0 centos 编译安装详解

    http://blog.csdn.net/w13770269691/article/details/16883663 废话不讲,直切正题. 搭建环境:Centos x 6.4 64bit 1.安装JD ...

  8. centos 7.0 编译安装mysql 5.6.22 再次总结 成功编译安装~ 越来越熟练了~

    查找php.ini文件所在位置 [root@localhost /]# find -name php.ini ./usr/etc/php/etc/php.ini mysql官网的安装说明http:// ...

  9. zabbix-proxy3.0.4编译安装

    数据库配置: innodb_file_per_table=1   安装mysql rpm -ivh http://dev.mysql.com/get/mysql-community-release-e ...

随机推荐

  1. Python实现将excel文件转化为html文件

    需要转化的excel文件(nsrxx.xlsx): 源代码: import pandas as pdimport codecspd.set_option('display.width', 1000)p ...

  2. Fastflow——基于golang的轻量级工作流框架

    Fastflow 是什么?用一句话来定义它:一个 基于golang协程.支持水平扩容的分布式高性能工作流框架. 它具有以下特点: 易用性:工作流模型基于 DAG 来定义,同时还提供开箱即用的 API, ...

  3. 20 HTTP 长连接与短连接

    20 HTTP 长连接与短连接 每日一句 纸上得来终觉浅,绝知此事要躬行. 每日一句 Never give up until the fight is over. 永远不要放弃,要一直战斗到最后一秒. ...

  4. npm run serve修改为npm run dev

    找到package.json文件,打开文件找到  "serve": "vue-cli-service serve"  这一行,把前面的 serve 修改 dev ...

  5. Linux系列之安装JDK

    卸载open jdk #查看jdk [root@localhost tools]# rpm -qa | grep jdk java-1.8.0-openjdk-headless-1.8.0.65-3. ...

  6. Jmeter(五十三) - 从入门到精通高级篇 - 懒人教你在Linux系统中安装Jmeter(详解教程)

    1.简介 我们绝大多数使用的都是Windows操作系统,因此在Windows系统上安装JMeter已经成了家常便饭,而且安装也相对简单,但是服务器为了安全.灵活小巧,特别是前几年的勒索病毒,现在绝大多 ...

  7. 使用 .NET MAUI 创建移动应用——Get Start

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 1.IDE下载安装 如果你还没安装Visual Studio 2022 预览版 你 ...

  8. cool-admin vite-vue3 打包部署 nginx代理设置

    location /api {rewrite ^/api/(.*)$ /$1 break;proxy_pass http://xxx.com;}location /socket.io {rewrite ...

  9. 11.Firewalld防火墙

    Firewalld防火墙 目录 Firewalld防火墙 Firewalld概述 Firewalld Firewalld和iptables的关系 netfilter Firewalld/iptable ...

  10. Mybatisi和Spring整合源码分析

    一.MybatisSpring的使用 1.创建 Maven 工程. 2.添加依赖,代码如下 <dependency> <groupId>org.mybatis</grou ...