mysql
0. 前言 1. 修改说明 2. 编译mysql-shell2.1 环境准备2.2 开始编译mysql & mysql-shell2.3 利用patchelf修改mysqlsh二进制文件 3. 运行mysql-shell for GreatSQL 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 :)
莫让知识快餐冲淡了思考来源人民网人民日报海外版从文字书籍广播电视到移动互联网,知识的生产与传播方式不断演变。如今,短视频发展如火如荼,知识付费方兴未艾,各种各样的知识正变得随处可见随手可学。相关研究报告
网络知识大集合(最详细)与网络通信过程问题首先我碰到了一个问题,一个数据包从我们的电脑上,经过层层的交换机路由器到达目标服务器的过程中,数据包会有哪些改动,是如何一步步传递过去又是如何返回回来的?数据流转示意先需要了解
切记,这样打日志定位Bug又快又准概述日常工作中,程序员需要经常处理线上的各种大小故障,如果业务代码没打印日志或者日志打印的不好,会极大的加大了定位问题的难度,使得解决bug的时间变长了。对于那种影响比较大的bug
美的造车生意经本报记者伍月明广州报道近日,美的集团董事长兼总裁方洪波出席了美的集团有史以来投资总金额最大的项目开工仪式。中国经营报记者从美的集团获悉,安庆威灵战略基地项目占地面积约30万平方米,
TMT时报知乎声明未使用行为感知系统监测员工情人节微信可以发520红包陌陌被曝启动港股上市计划科创板日报2月14日讯,今日财联社TMT要闻精选主要内容有知乎声明未使用行为感知系统监测员工,坚决反对违规收集个人信息陌陌被曝启动港股上市计划印度再禁50款中国手机应用。情人节微信
欠钱不还的人要小心了你好,你的微信钱包已被冻结。前不久,一位朋友大刘突然收到了来自微信支付的通知,微信钱包内仅有的900余元零钱一夕之间全部被冻结了!这是怎么一回事呢?到底是腾讯bug了,还是微信被盗
阿里AI现身冬奥剪出近4万条精彩集锦视频北京冬奥昨日结束,17天的赛事精彩纷呈,各种集锦视频也引爆新媒体平台,其中不少可能是阿里AI的作品。因为能理解比赛内容分析运动员动作,阿里AI实时生成多种类型的集锦视频,冬奥期间共
扫地机器人排名,家用扫地机十大排名推荐冰尊扫地机器人是世界扫地机器人十大排名领导品牌。家用扫地机器人普及率在不断上升,主要集中在城市年轻的新一代消费群体。在面对各式各样的扫地机器人的时候,我们该如何进行选择呢?下面就为
北京航空航天大学交通科学与工程学院教授高峰农业机器人是农业创新的风口机器人在田间进行植保作业,还能帮人收甘蔗玉米当智能装备进军农业领域,将极大改变传统耕种模式,既省时省力,又精准高效。这一切已悄然发生,农业机器人正成为我国农业创新的风口。北京航空航
那些堪称神器的APP,有多少人知道?钱迹一款生活服务类的手机app。纯粹是为做账而打造出的。记录你的每一笔花销,方便你做出计划。无截屏,无广告,无后台管理的三无产品。记录明确,详细,结果一目了然。食物派吃货的必备神器
2017C期末总复习面向对象程序设计及C总复习第1章面向对象程序设计及C语言概述1基本概念(1)面向对象的三个主要特性(2)C源程序的扩展名。cpp编译后的目标文件的扩展名。obj链接后的可执行文件的
差异化战略定位下英雄联盟手游的诚意与未来展望国庆后的第一个工作日,英雄联盟手游国服终于与盼望已久的玩家见面。这个时间点很巧妙,地球的另一边冰岛围绕英雄联盟S11全球总决赛正在如火如荼的展开中,多方提前布局和IP赛事的热度加持
网易终于放了今年第一个大招在社交和玩法上做自己擅长的事来增加成功率网易副总裁胡志鹏前阵子接受外媒采访时谈到,希望能借助永劫无间来推动网易在海外市场的扩张。公司希望未来50的游戏收入来自海外市场,该比例目前约
宝可梦大集结海外霸榜,大厂出海的阳谋扬名大于更多创收9月22日,宝可梦大集结手游2小时登顶了超过65个国家和地区的游戏免费榜的新闻开始了刷屏。有Switch版2个月900万下载量的珠玉在前,这个成绩其实也在预料之中,
天梯高手站在全球总决赛舞台前,TOC2打开了那扇门给普通玩家提供顶级赛事的通道,是电竞全民化最好的展现。9月19日,第二届英雄联盟云顶之弈公开赛(以下简称TOC2)全国总决赛正式拉开帷幕,共计24名选手争夺100万元的冠军奖金以及
加码福利内容投入腾讯应用宝8周年生日派对正式开启9月25日至9月29日,腾讯应用宝正式开启8周年生日派对。用户可以在腾讯应用宝App进入活动页面,通过获取口令下载指定App邀请新用户三种方式获得抽奖机会,赢取丰厚奖品。此外,在本
盛世碰撞,遇见胡旋国庆前夕,王者荣耀上线了和敦煌研究院联手打造的第三款皮肤遇见胡旋。此次第三度合作是在前两次的皮肤形象合作基础上再度进阶,希望挖掘出敦煌灿烂的乐舞艺术之美,而为什么是敦煌如何表现敦煌
数据战争的背后价值隐私与边界以代表数字经济本质的三个V体量(Volume)维度(Variety)速率(Velocity)来度量,科技正在以前所未有的广度丰富度和实时的能力驱动经济的数字化。馨金融洪偌馨文人类对
10的分水岭该来的总会来2021年上半年,中国移动游戏市场实际销售收入1147。72亿元,同比增长9。65。虽然我们都知道,随着工作生产其他娱乐恢复正轨,用户对于手游的投入确实会减少,但低于1
iPad生产力平价新选择smorss一体式蓝牙iPad键盘保护套测评前言自打iPadPro这个产品线发布以后,配件品牌就开始大力发展各种蓝牙键盘,目的就是能够让iPad有着更高的生产力。尤其是前阵子的M1芯iMac发布,更是把iPad的性能提升了一
整合全平台资源,企业云网引领企业数字化转型的浪潮现如今,企业数字化转型的浪潮席卷各个行业,科技赋能对引领数字时代起到至关重要的作用,对企业而言,是机遇更是挑战。在网络安全协作绿色高效等领域不断创新,融合高新智能硬件设施软件应用服
刷新三观电竞假赛还能这么玩?1hr传统对于假赛的认知,要么是买通一方,要么是买通双方,再极端一点是把主办方裁判等一起买通。然而,最近根据六安检察官方发布的消息,出现了这样的一个假赛案例,堪称刷新三观。这起案件