mysql-shell for GreatSQL 8.0.27编译安装及使用
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 环境准备
下载几个相关的安装包:
- protobuf-all-3.11.4.tar.gz,https://github.com/protocolbuffers/protobuf/releases?page=5
- mysql-8.0.27.tar.gz,https://downloads.mysql.com/archives/community/
- mysql-shell-8.0.27-src.tar.gz,https://downloads.mysql.com/archives/shell/
- boost_1_73_0.tar.gz,https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.gz
- patchelf-0.14.5.tar.gz,https://github.com/NixOS/patchelf/releases/download/0.14.5/patchelf-0.14.5.tar.gz
- rpcsvc-proto, https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz
利用下面的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编译安装及使用的更多相关文章
- Shell脚本一键部署——源码编译安装MySQL及自动补全工具
Shell脚本一键部署--源码编译安装MySQL及自动补全工具 编译安装MySQL 1.软件包 Mysql安装包 将安装包拖至/opt目录下,编辑一个脚本文件,将以下内容复制进去,然后source或者 ...
- 在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(网上有 ...
- linux下Mysql 8.0.19 编译安装
1 前言 linux下安装MySQL的方式有很多种,包括以仓库的方式安装(yum,apt,zypper),以包的方式安装(rpm,deb),以docker方式安装,从压缩包解压安装,从源码编译安装,这 ...
- 一文吃透zabbix4.0的编译安装,最全最详细的安装。
什么是zabbix? zabbix作为一款企业级,开源的,分布式的监控套件,解决了以往监控软件的短板,可以说是现在流行的监控解决方案之一. 监控系统的理想化模样 1.监控数据收集及可视化. 2.数据要 ...
- hadoop-2.2.0 的编译安装及HA配置
一 准备工作 准备工作中要求有 1.centOs 6.4,添加hadoop用户,配置集群内的/etc/hosts文件. 2.安装hadoop用户的ssh,并打通集群内所有机器,(ha执行fencing ...
- Mapnik 3.0.20编译安装
1. 确定epel安装 yum install -y epel-release 2. 按照<CentOS7.2部署node-mapnik>一文中的步骤,手动安装 gcc-6.2.0 和 b ...
- hadoop2.2.0 centos 编译安装详解
http://blog.csdn.net/w13770269691/article/details/16883663 废话不讲,直切正题. 搭建环境:Centos x 6.4 64bit 1.安装JD ...
- centos 7.0 编译安装mysql 5.6.22 再次总结 成功编译安装~ 越来越熟练了~
查找php.ini文件所在位置 [root@localhost /]# find -name php.ini ./usr/etc/php/etc/php.ini mysql官网的安装说明http:// ...
- zabbix-proxy3.0.4编译安装
数据库配置: innodb_file_per_table=1 安装mysql rpm -ivh http://dev.mysql.com/get/mysql-community-release-e ...
随机推荐
- 103_Power Pivot 透视表中空白标签处理及百分比
焦棚子的文章目录 请点击下载附件 1.案例来源于不断变化的需求 事实表:销售表 维度表:城市表 销售表和城市建立多对一的关系 如图1: 图1 2.插入透视表 如图2: 图2 3.问题 1.销售表中,城 ...
- Spring Ioc源码分析系列--@Autowired注解的实现原理
Spring Ioc源码分析系列--@Autowired注解的实现原理 前言 前面系列文章分析了一把Spring Ioc的源码,是不是云里雾里,感觉并没有跟实际开发搭上半毛钱关系?看了一遍下来,对我的 ...
- 从零开始学YC-Framework之鉴权
一.YC-Framework鉴权是基于哪一个开源框架做的? YC-Framework鉴权主要基于Dromara开源社区组织下的Sa-Token. 1.什么是Sa-Token? Sa-Token是一个轻 ...
- 解惑unittest框架中导入HTMLTestRunner模块后正常运行却无法生成HTML报告问题
1.HTMLTestRunner介绍 HTMLTestRunner是一个第三方的unittest HTML报告库,用于python单元测试框架的TestRunner.它是生成一个HTML报告,以一目了 ...
- RocketMQ的基本使用
第一步导入依赖: <!--Springboot 集成 RocketMQ依赖--> <dependency> <groupId>org.apache.rocketmq ...
- 【Redis】ziplist压缩列表
压缩列表 压缩列表是列表和哈希表的底层实现之一: 如果一个列表只有少量数据,并且数据类型是整数或者比较短的字符串,redis底层就会使用压缩列表实现. 如果一个哈希表只有少量键值对,并且每个键值对的键 ...
- CentOS中实现基于Docker部署BI数据分析
作为一个专业小白,咱啥都不懂. linux不懂,docker不懂. 但是我还想要完成领导下达的任务:在linux中安装docker后部署数据可视化工具.作为一名敬业 的打工人摆烂不可以,躺平不可以,弱 ...
- Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- Linux shell环境的配置
shell配置文件分类 按生效范围分类:全局和局部 按登录方式分类:交互式和非交互式 按功能分类:profile和bashrc shell配置文件按生效范围分类: 全局配置:针对有所用户有效 /etc ...
- Linux shell脚本算术运算和逻辑运算
算术运算 默认不支持算数运算.所以需要特定的语法来完成, shell进行算数运算的工具: let declare (())或$(())或$[] bc let: 格式: let var=算术表达式 例如 ...