​8.实践MySQL多实例和高可用集群

8.实践MySQL多实例和高可用集群

2019-10-28 22:02:02

        MySQL(本章中MySQL数据库是指OracleMySQL社区版本,同时包括其著名分支版本MariaDB,Percona Server和TokuDB等,为了表达简洁下文统一简称为MySQL,除非特别强调某个版本。此外,本章所说的数据库同时也是关系型数据库管理系统(RDBMS)软件的流行称呼,同时也是LEMP stack,LEPP stack最为重要的组成部分,本章将深入MySQL数据库,帮助大家快速掌握MySQL的部署,使用和管理。

        先来了解一下极具参考价值的是数据库排名网站DBEngines Rinking,和世界著名的编程语言排名网站TIOBE类似,数据库中权威的排名网站非DBEngines Ranking莫属了,各种数据库的排名,商业的,开源的,关系型,非关系型的,该排名比较客观地反应了数据库的选择,其官方网址如下:

        https://db-engines.com/en/ranking

        MySQL长期稳定地雄踞排名榜的第二名,可见其火爆程度。

8.1MySQL数据库大家族及版本选择

    8.1.1纷繁的MySQL数据库家族

        MySQL在互联网的早期就已经十分流行了,目前仍是互联网数据库的中流砥柱,虽然通常将其归类为Thin Database(轻量级数据库),但其在许多新兴领域,如互联网企业,电子商务等领域崭露头角,提供了不逊色于传统大型数据库的性能和可靠性,个人认为追求速度、保持简单,坚持开源,几乎支持所有操作系统和开发语言是其成功的主要原因,MySQL的Logo如图8-1所示。

logo-mysql-170x115.png

        MySQL图8-1 MySQL Logo(图片来源:MySQL官方网站)

        MySQL官方主页:

        https://www.mysql.com/

        MySQL并不是功能最全最强的数据库,但却是比较简单的数据库,其采用C/C++开发,完全支持多用户和多线程技术,支持海量数据存储。如果仅仅是一个孤立的数据库,MySQL可能很难如此流行,其对于Web服务端的脚本语言的完善支持是其流行的重要原因,这MySQL对流行的Perl、Python及PHP提供了相当出色的支持,从而构成互联网上流行的LAMP stack应用架构,傍上互联网这个大款,发展速度想不快也难。更深入地讲,MySQL所采用的是插件式的存储引擎,也就是说MySQL的存储引擎可以根据实际需求选择和定制,十分灵活,最常用就是MyISAM和InnoDB两大存储引擎,它们优势互补,拓展了MySQL应用领域。需要注意的是MySQL5.5.5之前,默认存储引擎是MyISAM,之后由于被Oracle收购,所以默认存储引擎就变成了InnoDB。

        Tips:MyISAM和InnoDB存储引擎

        简而言之,MyISAM存储引擎的设计思路是简单和速度,不支持事务处理(生产环境,此功能很重要),行锁等高级功能,而这些InnoDB统统支持,但速度略逊一筹,功能和速度比较均衡,鱼和熊掌难以兼得,最重要的还是根据应用环境选择最合适的存储引擎,如果数据库绝大多数时间执行大量的SELECT语句,MyISAM存储引擎是一个很好的选择,但如果是需要事务,行锁等支持且对速度不敏感的环境InnoDB表现可能会更好。

        不过随着MySQL的发展,MyISAM存储引擎已显得老态龙钟,其优点已经逐渐被InnoDB存储引擎实现和取代了,所以InnoDB是MySQL存储引擎的未来,下一代的MySQL中MyISAM可能被边缘化。

        但近几年来,MySQL发展却命运多舛,先是其采用的存储引擎InnoDB被Oracle收购,以及自身最终被Oracle收购,这样的结果促使MySQL的创始人从MySQL分出了一个分支,这就是后来的MariaDB(玛丽亚数据库),MariaDB的Logo如图8-2所示。

    MariaDB_Logo.png

        图8-2 MariaDB Logo(图片来源:MariaDB官方网站)

        MariaDB官方主页:

        https://mariadb.org/

        该数据库最大的特点就是采用XtraDB存储引擎代替InnoDB,并且与MySQL原生版本完全兼容,同时又保留了MySQL原本的自由和开放。XtraDB存储引擎是由Percona开发并维护的高性能存储引擎,基于InnoDB存储引擎的开发,其开发目的主要是替代MySQL原来所采用的InnoDB存储引擎,不仅完全兼容lnnoDB,而且在I/O性能,锁性能,内存管理等多个方面进行了优化和提升。

        而著名的MySQL数据库咨询公司Percona也基于该存储引擎推出自己的MySQL分支-Percona Server,其Logo如图8-3所示。

        logo-percona-server.png

        图8-3 Percona Server Logo(图片来源:Percona官方网站)

        Percona Server官方主页:

        https://www.percona.com/software/mysqI-database/percona-server

        这样MySQL就有了MariaDB和Percona Server这两个基于XtraDB存储引擎的著名分支,多之哉,不多也,除了XtraDB存储引擎之外,还有一个后起之秀-TokuDB,它是一个高性能、支持事务处理的存储引擎,版本为5.6。在TokuDB官网测试结果[1]TokuDB性能比InnoDB高出很多,支持MySQL,MariaDB和Pecona Server等主流数据库版本。和InnoDB和XtraDB相比,TokuDB的主要特点是超高的INSERT性能,高压缩比,支持大多数在线修改索引、添加字段等操作,尤其适合高INSERT,少UPDATE的应用环境。

        TokuDB官方主页:

        https://www.percona.com/software/mysqI-database/percona-tokudb

    8.1.2MySQL版本,版本号和选择

        Oracle官方MySQL有如下几个版本:

        ◆MySQL Community Server

        MySQL社区版本,免费开源无技术支持,基本沿袭了MySQLAB时代的情形。

        ◆MySQL Enterprise Edition

        MySQL企业版本,免费试用30天,付费技术支持,和社区版相比,除了数据库外,其还包含了MySQL Enterprise Backup,MySQL Enterprise Monitor和MySQL Workbench Standard Edition等几个专业工具。

        ◆MySQL Cluster

        MySQL免费集群版本,虽然号称集群版本,但生产环境中使用并不广泛,可能是其至少需要四个节点的缘故吧。

        ◆MySQL Cluster CGE

        集群的收费版本,除了包含集群软件还包MySQL Cluster Manager,MySQL EnterpriseBackup和MySQL Enterprise Monitor等管理工具。

        至于MySQL的版本号命名规则,也很简单,由三个数字和一个后缀组成的。例如,较新的版本mysql-5.7.12版本号含义为,第一个数字5是主版本号,第二个数字7是发行级别,主版本号和发行级别组合到一起便构成了发行序列。而第三个数字12则是在此发行序列的版本号,随每个新版本递增。需要注意的是,每次更新后,版本字符串的最后一个数字递增。功能增强的同时也意味着相对于前一个版本增加了新功能并可能存在一定的不兼容风险。

    最后一个后缀用于显示该软件的成熟程度,常见的后缀有Development,Alpha,Beta,RC和GA,通常的生产环节要选择GA版本,GA是Generally Available'的缩写,可用版本的意思,类似于大家常说的正式版。至于MySQL的各个分支,MariaDB只是在版本号上比MySQL官方版本高很多,其他几乎完全相同,而Percona的版本号则与MySQL官方高度一致,只是将mysql替换为percona而已。

        Tips:MySQL版本进化史

        ◆Development版本:开发版本,功能不完善,软件成熟度低,可能存在大量BUG,又称为Pre-Alpha版本,普通用户一般碰不到

        ◆Alpha版本:一般指内测版本,功能特性还没有冻结,很多时候还会向代码中添加新特性,普通用户一般见不到

        ◆Beta版本:通常是指公测版本,功能特性已经冻结,多数情况不向代码中添加新特性,普通用户很少见到

        ◆GA版本:稳定版本,也是最常见的版本,且适合生产环境中使用,推荐普通用户尤其是企业用户选用

        最后探讨一下MySQL官方版本,MariaDB和Percona如何选择的问题,据笔者经验给大家一点建议,仅供参考,如果已经部署了大量MySQL官方版本且工作稳定可靠,就没有必要冒险迁移到其他衍生版本,就目前而言,Oracle短时间不可能彻底改变MySQL的开发和商业模式,强行向用户收费的概率不大,所以不要自找麻烦,至于新部署的服务器,如果对MySQL的官方版本有所担忧,可以首先考虑与MySQL高度兼容的Percona系列,其次是MariaDB。

        Tips:生产环境选择MySQL版本

        生产环境选择MySQL版本肯定要GA版本,而且一般不选最新GA版本,而是选择比最新版本晚35个版本的GA版本或1016个月前发布的GA版本,然后在Pre-Production环境进行功能测试和性能测试,最后试运行一个季度或半年左右,如果该版本运行稳定可靠则可以考虑在生产采用此版本。

8.2 部署MySQL

        主要有两种方法部署MySQL,一种是通过官方软件仓库进行安装,最省事高效的作法,另外一种则是从源代码编译安装,可根据自己的需求灵活定制并编译出MySQL,两种方法各有优劣,适合自己的才是最好的。此外,还有一个误区,就是动辄就采用编译安装,认为只有这样才专业,其实不然,除非定制需要否则还是从官方软件仓库安装比较好,因为大家不可能比红帽更了解MySQL的技术细节,并且编译代码浪费大量时间。

    8.2.1.从官方软件仓库部署单节点MySQL数据库服务器

        RHEL8对MySQL和MariaDB提供了很好的支持,在其软件仓库中都有现成的软件包,唯一的麻烦是鱼和熊掌不可兼得,也就是说,安装了MySQL就不能安装MariaDB,要部署MariaDB就必须卸载MySQL,提醒大家注意的是,最好一开始就选定一个数据库来安装,装完一个再装另外一个很容易出现mysql service masked的麻烦,此外本章的所有演示都是基于默认的数据库MariaDB。

        在命令行部署MySQL/MariaDB比较简单,只需要运行如下命令即可快速安装:

            dnf install @mysql-y

            或:

            dnf install mariadb-server -y

            或:

            dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm  -y

            dnf module disable mysql

            percona-release setup ps57

            dnf install Percona-Server-server-57 Percona-Server-client-57 -y

        安装后还需要运行如下命令安装实例数据库并进行安全加固:

            mysql_secure_installation

        在运行mysql_secure_installation安全加固过程中,安装程序会提出一些问题,根据自己的需求提示回答问题即可成功加固。

        管理MySQL数据库及其衍生版本服务MySQL部署成功后,可以使用如下命令来启动,停止和重启:

            systemctl start mysqld        #启动MysQL服务命令

            systemctl stop mysqld             #停止MySQL服务的命令

            systemctl restart mysqld         #重新启动MysQL服务的命令

        随系统自动启动数据库

        如果需要MySQL服务随系统启动自动运行,可以执行如下命令:

            systemctl enable mysqld

        执行后还可以用如下命令撤销先前的操作:

            systemctl disable mysqld

        读到这里,细心的朋友肯定会问,为什么管理MariaDB及Percona都使用mysql来操作?这其实是为了保证和MySQL的兼容性所采取的措施,其实只要用mysql命令进入数据库,就可以知道是MariaDB或Pecana数据库。

    8.2.2源码包部署单节点数据库服务器

        在实际工作环境中,常常需要从MySQL源码包编译安装,下面就以最新的GA版本的Percona Server 5.7.26-29为例来掌握从源代码部署单节点数据库的方法,需要注意的是,无论是MySQL社区版本还是其各种衍生版本,其编译安装方法都基本相同,大家可以举一反三。

       ◆下载源码包

        编译安装一定要有源码包,使用如下命令下载:

            cd /usr/local/src 

            wget https://www.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.26-29/source/tarball/percona-server-5.7.26-29.tar.gz

            wget https://netcologne.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz

        ◆解包解压 

        运行如下命令对压缩包进行解压解包:

            tar zxvf percona-server-5.7.26-29.tar.gz 

            tar zxvf boost_1_59_0.tar.gz

        ◆安装依赖库和编译工具 

        编译安装前还需要安装所需依赖及工具, 关键操作如下:

            dnf groupinstall 'Development Tools' -y 

            dnf install boost gcc-c++ make cmake bison ncurses-devel libaio-devel perl perl-Data-Dumper readline-devel zlib zlib-devel libcurl-devel.x86_64 libtirpc-devel -y

        ◆编译安装jemalloc库

        由于CentOS8已经移除其开发库,故需编译安装所需的jemalloc开发库,方法如下:

            wget https://github.com/jemalloc/jemalloc/releases/download/5.2.0/jemalloc-5.2.0.tar.bz2

            tar jxvf jemalloc-5.2.0.tar.bz2 

            cd jemalloc-5.2.0 

            ./configure --prefix=/usr/local/jemalloc 

            make && make install 

        ◆编译安装rpcgen 

        由于CentOS8已经移除该软件包,需要手 动编译安装,方法如下:

            wget https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz

            tar zxvf rpcsvc-proto-1.4.tar.gz 

            cd rpcsvc-proto-1.4 

            ./configure 

            make && make install

        ◆创建MySQL用户 

        创建MySQL的相关用户及用户组,具体操作如下:

            groupadd mysql 

            useradd -g mysql -s /sbin/nologin -M mysql 

        ◆创建数据目录 

        运行如下命令创建数据库的主目录:

            mkdir -p /data/mysql 

            chown mysql:mysql -R /data/mysql 

        ◆编译安装 

        要编译安装,首先需要进入源码目录:

            cd /usr/local/src/percona-server-5.7.26-29/ 

        参考配置如下,大家可以根据自己的需求 灵活添加或删除模块:

            cmake  .  -DMYSQL_USER=mysql  \ 

                           -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ 

                           -DMYSQL_DATADIR=/data/mysql \ 

                           -DMYSQL_UNIX-ADDR=/tmp/mysqld.sock \ 

                           -DEXTRA_CHARSETS=all \ 

                           -DDEFAULT_CHARSET=utf8 \ 

                           -DDEFAULT_COLLATION=utf8_general_ci \ 

                           -DWITH_INNOBASE_STORAGE_ENGINE=1 \ 

                           -DWITH_PARTITION_STORAGE_ENGINE=1 \ 

                           -DWITH_FEDERATED_STORAGE_ENGINE=1 \ 

                           -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 

                           -DWITH_MYISAM_STORAGE_ENGINE=1 \ 

                           -DENABLED_LOCAL_INFILE=1 \ 

                           -DWITH_EMBEDDED_SERVER=1 \ 

                           -DWITH_BOOST=/usr/local/src/boost_1_59_0 \ 

                           -DWITH_JEMALLOC_DEFAULT=/usr/local/jemalloc 

        如图:

image.png

或写成这样也可:

cmake . -DMYSQL_USER=mysql -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX-ADDR=/tmp/mysqld.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 -DENABLED_LOCAL_INFILE=1 -DWITH_EMBEDDED_SERVER=1 -DWITH_BOOST=/usr/local/src/boost_1_59_0 -DWITH_JEMALLOC_DEFAULT=/usr/local/jemalloc

        成功配置后,即可运行如下命令开始漫长 的编译:

        make -j 8        #编译源码包,j参数指定处理器核数以更快地编译源码,笔者服务器为8核,所以是8,如不清楚就只运行make命令直接编译即可

            make install 

        成功安装后,还需如下配置:

            chown -R mysql:mysql /usr/local/mysql 

            mv /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

        ◆初始化Percona数据库并运行 

        由于MySQL5.7.18官方已移除了默认的模板配置文件my-default.cnf,故需要手动创建主配置文件/etc/my.cnf,操作如下:

        vi /etc/my.cnf 

            最为核心的参数如下:

            [mysqld] 

            basedir=/usr/local/mysql 

            datadir=/data/mysql 

            port =3306 

            切换到Percona安装目录:

            cd /usr/local/mysql/

            运行如下命令开始初始化数据库:

            /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf  --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

            成功初始化后和配置好my.cnf文件之后即可运行Pecona数据库:

            /etc/init.d/mysqld start

            Starting MySOL (Percona Server).Logging to '/data/mysql/www.example.com.err'.

                SUCCESS!

        ◆完善MySQL运行环境

        为了使用方便,要将将相关路径添加到环境变量SPATH,同时也可以避免很多错误的发生,具体实现如下:

            echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile

            source /etc/profile

        至此,Percona编译安装完成,使用Percona命令和上述MySQL和MariaDB最大的不同是要在命令前添加/usr/local/mysql/bin/或相关路径。此外,从源代码编译安装最大的好处是可以根据需求灵活定制安装,如指定安装目录,配置文件目录,所支持的字符编码以及数据库目录等,更多的编译参数请参阅Percona官方文档:

        https://www.percona.com/doc/percona-server/5.7/index.html

        ◆管理Percona数据库服务

        Percona部署成功后,可以使用如下命令来启动,停止和重启:

            /etc/init.d/mysqld start         #启动Percona服务命令

            /etc/init.d/mysqld stop            #停止Percona服务的命令

            /etc/init.d/mysqld restart             #重新启动Percona服务的命令

        随系统自动启动数据库

        如果需要MySQL服务随系统启动自动运行,可以执行如下命令:

            vi /etc/rc.local

            添加如下内容:

            /etc/init.d/mysqld start

            保存退出后添加执行权限生效:

            chmod +x /etc/rc.local

        配置MySQL数据库

        无论哪种方式安装,成功后,建议对数据库进行配置。

        ◆关闭自动提交事务

        MySQL为默认的事务提交方式自动提交,及MySQL输入的每一条DML命令,一旦回车马上提交,这样的好处是简单易用,太自动化了,以至于用户都没有意识到事务已经提交,这样的缺点是影响数据库的性能,如想数据库插入了100条数据,PerconaServer就会提交100次,每此插入操作都被当做一个单独的事务自动执行,但在其他数据库中,默认是手动提交事务,同样插入100条数据,只需最后手动提交一次即可,所以需要将默认的自动提交改为手动提交,具体方法如下:

            mysql -u root -p

        成功登录到数据库后使用如下命令查看当前Autocommit的值:

            >SHOW VARIABLES LIKE 'autocommit';

        image.png            

        Autocommit的值是ON,表示自动提交功能开启,然后通过如下SQL命令修改为手动:

            mysql> SET autocommit = 0;

        值0和OFF是等价的,就是关闭事务的自动提交当然,这样用户将一直处于某个事务中,直到执行一提交命令COMMIT或回滚命令ROLLBACK语句才会结束当前事务。需要提醒大家的是,这项配置仅在当前会话生效,重启MySQL服务后配置将丢失,最保险的做法是写入主配置文件my.cnf中,永久生效,关键配置如下:

            vi /etc/my.cnf

            添加如下内容:

            [mysqld]

            autocommit=0

        配置后重启生效后,默认既是手动提交事务。

        ◆添加对二进制日志的支持

        二进制日志(Binary log)的支持对于MySQL数据库来说极为重要,该日志以二进制形式记录所有数据改变的SQL语句,主要用于数据库数据恢复或主辅同步,但默认情况其并不开启,具体开启方法如下:

            vi /etc/my.cnf 

            追加如下内容开启二进制日志:

                log-bin=/var/lib/mysql/mysql-bin 

                server-id=1 

            如果是编译安装,配置如下:

            log-bin=/data/mysql/mysql-bin         #开启二进制日志

            server-id=1                 #服务器ID编号要唯一

        然后保存退出即可。重启服务后再次登录MySQL数据库,运行如下命令:

        mysql -uroot -p 

        >SHOW VARIABLES LIKE '%log_bin%'; 

        image.png

        这时二进制日志已经打开,进入相应目录可以看到以mysql-bin开始的二进制日志文件(类似mysql-bin.000001.)以及所有二进制日志文件的索引文件(mysql-bin.index),索引文件以文本文件格式保存,可以用cat或编辑器打开,保存着所有的二进制日志文件名,关键操作如下所示:

            cd /var/lib/mysql

        或编译部署:

            cd /data/mysql

        应该会看到一个或多个二进制日志。

        image.png

        Tips:二进制日志的种类和文件格式二进制日志有三种格式:

        ◆SBR(Statement-Based Replication):基于SQL语句的复制,对应STATEMENT格式日志文件

        ◆RBR(Row-Based Replication):基于行的复制,对应ROW格式日志文件

        ◆MBR(mixed-based replication):混合模式复制,对应MIXED格式文件

        Percona默认采用ROW格式的二进制日志,可以使用如下命令查看:

            SHOW VARIABLES LIKE 'binlog_format';

        image.png

        如果是要指定其他二进制日志格式,可以在/etc/my.cnf中添加如下配置:

        binlog-format=STATEMENT

        ◆添加慢查询日志的支持

        过慢的查询语句会严重影响数据库性能,MySQL提供了慢查询日志,记录了“过慢”的查询语句,方便对数据库性能调优,关键口署加下

         vi /etc/my.cnf 

        追加如下内容开启慢查询日志:

            [mysqld] 

            slow-query-log=1 

            slow-query-log-file=/var/lib/mysql/slow.log 

            long-query-time=2 

        或编译部署:

            slow-query-log=1 

            slow_query-log-file=/data/mysql/slow.log 

            long-query-time=2 

            保存退出即可,重启服务后配置生效。最后可以运行如下命 

        >SHOW VARIABLES LIKE '%slow_query_log%';

        image.png

        或编译部署:

        >SHOW VARIABLES LIKE '%slow_query_log%';

        image.png

        配置后,超过2秒的查询将统统记录在案,慢查询日志可以有效地帮助数据库性能优化,企业用户一定要开启。

    8.3.MySQL数据库客户端程序mysql

        mysql命令同样是十分常用的命令,关键操作方法如下:

        ◆获得mysql命令行参数

            mysql --help | more  #由于参数众多所以要加more 

        或:

            mysql -? | more

        mysql的参数很多,掌握熟练几个常用的参数,剩下的也不用刻意去背去记,只需掌握上述两个命令,随时可以获得。

            mysql --help | more

            image.png

                中间省略……

            image.png

        从上述结果来看,光一个mysql命令的参数就如此之多,下面将介绍重要的参数的使用:

            mysql命令格式:

            mysql  [OPTIONS]

            [OPTIONS]表示mysql的命令参数,有短格式(-开头)和长格式(--开头)两种,重要的参数有

            -u 用户名        #指定登录用户

            -p       #安全方式输入用户登录密码,即不在mysql命令行中出现密码,如果一定要在命令行中指定用户相应密码,不能加空格,这种方式存在安全风险

            -P 端口号        #MYSQL服务器端不使用默认的3306作为端口,客户端可以使用大写的P参数来指定

            -h 主机名        #指定主机IP或主机名(必须可以被DNS解析),参数和用户名之间有无空格均可

            -D 默认数据库名        #-D后面可以指定登录MySQL后默认数据库

            上述这几个重要参数,除了-p参数比较特殊之外,其他参数和所对应的有无空格均可。

            mysql -u root -P 3308 -h localhost -D sakila -p

            或

            mysql -uroot -P3308 -hlocalhost -Dsakila -p

            上述命令结果的是一样的。登录后使用如下命令检测默认数据库:

            mysql>SELECT DATABASES();

            +------------------------------------+

             |                  database()                   |

            +------------------------------------+

             |                       sakila                      |

            +------------------------------------+

             1 row in set (0.00 sec)

        如果获得如上结果,说明一切正常,登录成功。当然上述是标准的写法,还可以偷偷懒,如-h默认就指本机localhost,所以可以不加,如果使用的就是MySQL默认的3306端口,-P参数也可以不加。上述这几个参数无论是SA还是MySQL DBA都务必要牢牢掌握,极为常用。还有一些常用参数下面将慢慢道来了解和使用。

        常用短格式:

            -e        #令MysQL数据库以非交互方式执行

            -H        #以HTML格式输出结果,直接将返回结

            -E        #令MySQL数据库默认以竖

            -X        #以XML格式输出结果,比较类似-H参数

            -v        #输出mysql执行的语句

            -V        #版本信息

            mysql -H -uroot -p

            Enter password:

        常用长格式:

            --no-auto-rehash        #关闭自动补齐功能

            --delimiter=自定义结束符        #默认情形mysql环境的SQL语句的结束符是分号,但可以通过delimter参数指定默认结束符,同时除非必要不推荐随意修改结束符

            --pager=分页程序        #查询结果多于一页,可以使用分页程序来显示输出结果,可以使用的分页程序有more(仅向下翻页)和less(向上向下双向翻页),它们类似Linux系统下的分页程序

            --no-pager         #禁用分页程序显示输出结果

            --prompt=自定义符号        #指定mysql提示符,默认为大于号>,可以根据需要自定义,类似Bash利用PROMPT环境变量指定命令行提示符

            --tee=自定义文件及路径        #令MySQL将输出重定向到所指定的文件中,和Linux系统中tee命令功能一样,输出两份,一份stdout 1,一份重定向到所指定文件中

            --no-tee         #禁用所设置上述tee功能

            --show-warnings         #用于显示MySQL的警告信息,如果错过了上一条警告信息,可以通过该参数来查看。

        需要注意的是,上述命令都可以在Linux命令行环境使用,即mysql登录前可以使用的参数,需要注意的是,几乎所有的参数都可以登录MySQL数据库后通过mysql内部命令进行修改和调整。

        通过mysql命令附加必要参数登录MySQL服务器:

            mysql-uroot-p 

            Enter password:

            后使用help命令,通过帮助信息可以看到mysql的客户端命令操作如下:

            image.png

        上述mysql客户端命令和上述mysql在命令行所示的参数基本一样,下面只针对mysql命令在Linux命令行环境下没涉及的常用参数进行讲解。

        clear                #不是Linux环境的clear清屏命令,而是用于中断无法结束的SQL语句,快捷方式为\c,要清楚屏幕,可以使用'system clear'

        connect           #在本机localhost环境,功能类似use,但connect主要功能是连接远程数据库,可以指定远程主机的IP地址

        edit                 #启用系统默认编辑器,如vi编辑上一条SQL语句,保存退出后再输入分号执行所编辑SQL命令,有时会用到

        ego                 #无需终止符的竖行显示,快捷方式为\G

        go                   #无需终止符的正常横行输出显示,快捷方式为\g

        exit和quit        #MySQL客户端退出登录

        source            #执行*.sql文件,批量执行SQL语句,后面跟*.sql文件的路径和名称,快捷方式为.

        status             #显示MySQL数据库DBMS的状态,如版本,重要参数值等

        system           #执行Linux命令行的命令,快捷方式为!

        rehash            #开启自动补齐功能,补齐功能很弱,一般不用

        charset           #切换字符集

        上述就是mysql登录前和登录后可以使用的参数及命令,不少吧,不要小看不起眼的mysql程序,功能还是相当丰富的,需要提醒大家的是,从官方软件仓库所安装的MySQL,将会自动生成一个初始化密码,换句话说就是不在可以用空密码登录MySQL数据库了,所自动创建的密码保存在/var/log/mysqld.log日志文件中,格式如下:

            ……

            7 2019-10-06T00:46:27.418486Z1[Note]A temporary password is generated for root@localhost:+lf3=NOWrwOD

            ……

        其中,+If3=NOWrWOD就是自动创建的密码,用于第一次登录,登录后必须使用如下命令修改密码,否则将无法执行SQL语句:

        ALTER USER root@localhost identified by 'abc_ABC_123’;#密码可以自定义,但一定要符合复杂性要求

    8.4实现单节点多实例(Multipleinstances of MySQL)

        前面已经成功地采用两种方式部署MySQL到单个节点,由于现在PCserver的技术突飞猛进,性能提升迅速,君不见生产环境八核十六核的服务器随处可见,但仅仅十年前,那些功能可能都是高端UNIX小机的诱人特性和大卖点。MySQL数据库一个很重要的特点就是单进程多线程,一台功能超强的服务器只跑一个mysqld进程浪费了大量的计算资源,为了解决这一问题,充分利用服务器硬件的资源,所以单节点MySQL服务器运行多个实例也就很有实用价值了,需要先来解释一下,所谓实例其实就是MySQL数据库管理程序mysqld在内存中的进程,多实例就是多个mysqld进程,需要注意的是,MySQL不像大型数据库Oracle或DB2那样强调实例的概念,但不表示实例不存在。而单节点多实例就是在一台MySQL服务器上,运行多个mysqld守护进程,管理和运行在多个端口上,可以在一定程度上提高服务器的使用效率。

        单节点多实例的实现需要MySQL数据库安装文件和所管理的数据文件的分离,保存到不同的目录,可以通过MySQL主配置文件/etc/my.cnf中basedir参数指定MySQL数据库安装文件的位置,同时也需要使用datadir参数指定所管理数据文件的位置,约定俗成的位置为/data/目录下,所以首先创建数据文件目录:

            mkdir -p /data/mysqld{3307,3308,3309}

            chown -R mysql.mysql /data/

        由于多个实例是由端口号区分不同实例,所以这里使用了3306(默认端口留给默认实例),3307,3308和3309这几个端口号来区别不同的实例,当然可以指定更多实例,可以根据实际需求灵活设置,首先需要创建几个额外的目录,然后将该文件夹属主和属组改为mysql。

        单节点MySQL数据库是通i过mysqld_multi这个Perl脚本管理多个实例的,所以需要在/etc/my.cnf文件中追加[mysqld_mult]字段,下面就以从源代码编译安装的Perconaserver为例,来介绍单节点四实例的配置方法:

        vi /etc/my.cnf 

            ……

            [mysqld_multi] 

            mysqld= /usr/local/mysql/bin/mysqld_safe 

            mysqladmin= /usr/local/mysql/bin/mysqladmin

            log = /data/my_multi.log 

            [mysqld3307] 

            user=mysql 

            pid-file= /data/mysqld3307/mysqld3307.pid

            server-id =3307 

            log-bin= /data/mysqld3307/mysqld3307-bin

            log-error = /data/mysqld3307/mysqld3307.err

            socket = /tmp/mysqld3307.sock 

            port = 3307 

            basedir = /usr/local/mysql 

            datadir =/data/mysqld3307/ 

            [mysqld3308] 

            user =mysql 

            pid-file= /data/mysqld3308/mysqld3308.pid

            server-id =3308 

            log-bin = /data/mysqld3308/mysqld3308-bin

            log-error = /data/mysqld3308/mysqld3308.err

            socket = /tmp/mysqld3308.sock 

            port = 3308 

            basedir = /usr/local/mysql 

            datadir =/data/mysqld3308/

            [mysqld3309] 

            user =mysql 

            pid-file= /data/mysqld3309/mysqld3309.pid

            server-id =3309 

            log-bin = /data/mysqld3309/mysqld3309-bin

            log-error = /data/mysqld3309/mysqld3309.err

            socket = /tmp/mysqld3309.sock 

            port = 3309 

            basedir = /usr/local/mysql 

            datadir =/data/mysqld3309/

            使用如下命令初始化新建的数据目录:

             cd /usr/local/mysql/bin/

            mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqld3307

            mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqld3308

            mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysqld3309

            启动多实例 

            首先启动默认端口数据库:

            /etc/init.d/mysqld start 

            然后使用如下命令启动其他实例:

            mysqld_multi --defaults-file=/etc/my.cnf start 3307

            mysqld_multi --defaults-file=/etc/my.cnf start 3307 

            mysqld_multi --defaults-file=/etc/my.cnf start 3307 

            或:

            mysqld_multi --defaults-file=/etc/my.cnf start 3307-3309

            使用如下命令查看各个实例的状态:

            mysqld_multi report 

            结果如下:

            image.png

            或通过sock查看:

            ll /tmp 

            image.png

            

        看到一共有四个sock文件及相应锁定文 件,说多实例运行成功。

        关闭多实例 首先关闭默认端口数据库:

        /etc/init.d/mysqld stop 

        然后使用如下命令关闭其他实例:

        mysqld_multi --defaults-file=/etc/my.cnf stop 3307        #然后依次关闭相应端口

        mysqld_multi --defaults-file=/etc/my.cnf stop 3308

        mysqld_multi --defaults-file=/etc/my.cnf stop 3309

        或:

        mysqld-multi--defaults-file=/etc/my.cnf stop 3307-3309 

        登录相应实例:

        mysql -u root -S /tmp/mysqld3307.sock 

        mysql -u root -S /tmp/mysqld3308.sock 

        mysql -u root -S /tmp/mysq1d3309.sock 

        由于这时root账号针对各个实例是没有密码的,所以可以直接登录,登录可以分别设置。可以分别登录到MySQL后,创建几个数据库,一个名为db3307,另一个名为db3308,最后一个为db3309,然后到数据文件夹以及数据库中分别查看,每个会话管理自己的数据库。

    8.5实现双节点主从复制

        生产环境除了单节点多实物之外,采用一主一从或多从架构也很流行,即一台主(Master)MySQL服务器(下文简称为主服务器)配以一台或多台从(SLAVE)MySQL服务器(下文简称为从服务器),同时主从复制也是MySQL最常见的MySQL高可用方案。主服务器将数据变更事件,如表结构变更,数据更新或删除等全部写入二进制日志,然后从服务器从主服务器同步二进制日志,并保存成本地的中继日志(relaylog),从服务器再根据中继日志将所有的数据变更事件重做一遍,这样主从服务器的数据就一样了,这也是主从复制的大致过程,下面就以从官方软件仓库安装的Percona server为例来实现MySQL的主从复制。

        熟悉的主从复制的过程,下面就来实现一个主从同步,这里采用两台服务器,分别是:

            主机名IP地址/子网掩码

            MySQLA(主服务器):mysqla 192.168.1.172/24

            MySQLB(从服务器):mysqlb 192.168.1.173/24

        首先要保证两台服务器可以相互ping通,能够解析对方的主机名,并且安装好MySQL数据库,然后还要在各自的MySQL服务中激活同步账户,具体操作如下:

        MySQL A数据库

            >GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.173'IDENTIFIED BY 'abc_ABC_123';

            >FLUSH PRIVILEGES;

        MySQL B数据库

            >GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.172'IDENTIFIED BY 'abc_ABC_123';

            >FLUSH PRIVILEGES;

        MySQL A数据库主服务器配置如下:

            vi /etc/my.cnf 

            [mysqld] 

            ……

            server-id=1 

            log-bin=/var/lib/mysql/mysql-bin 

            ……

        MySQL B数据库从服务器配置如下:

            vi/etc/my.cnf 

            ……

            [mysqld] 

            server-id  =2

            relay-log = /var/lib/mysql/relay-bin

            skip-slave-start = 1

            innodb_flush_log-at-trx-commit=2 

        需要注意的是,'server-id'参数的值一定要唯一,主从服务器的值绝不能相同,而'innodb_flush_log_at_trx_commit=2'参数可以提高从服务器同步速度,完成配置重启MySQL数据库。

        至于主服务器的用户名,密码和地址等信息信息可以使用'CHANGE MASTER TO'语句设置。在添加上述信息之前,先使用如下命令暂停从服务器的同步:

            >STOP SLAVE;

            然后根据主服务器的实际情况添加相应信息:

            >CHANGE MASTER TO MASTER_HOST='192.168.1.172,

                    MASTER_USER='replication',

                    MASTER_PASSWORD='abc-ABC_123',

                    MASTER_LOG_FILE='mysql-bin.000001',#此名称一定要为主服务器真实的名称,否则会报Last_IO_Errno错误

                    MASTER_LOG_POS=154;

        确认无误后启动同步:

            >START SLAVE;

            可以使用如下命令检查主从服务器状态:

            ◆主服务器状态

            >SHOW MASTER STATUS\G

*********************************************** 1.row ***********************************************

                                                  File:mysql-bin.000005 

                                          Position:608 

                                Binlog-Do-DB:

                           Binlog-Ignore-DB:

                          Executed_Gtid-Set:

    1 row in set (0.00 sec)

            ◆从服务器状态

            >SHOW SLAVE STATUS\G

*********************************************** 1.row ***********************************************

                                                    Slave_IO_State:Waiting for master to send event

                                                       Master_Host:192.168.1.172 

                                                       Master_User:replication 

                                                        Master_Port:3306 

                                                    Connect-Retry:60 

                                                  Master_Log-File:mysql-bin.000001 

                                        Read_Master_Log-Pos:608 

                                                    Relay_Log-File:relay-bin.000002 

                                                    Relay-Log-Pos:821 

                                        Relay_Master_Log-File:mysql-bin.000001 

                                               Slave-IO_Running:Yes 

                                            Slave-SQL_Running:Yes 

                                                Replicate-Do_DB:

                                          Replicate-Ignore-DB:

        如果看到从服务器状态为'Waiting for master to send event',且确认Slave_I0_Running和Slave_SQL_Running的值为Yes,说明主从同步正常。可以在主服务器创建一个数据库或数据表,然后在从服务器上查看,如果能看到主服务器上创建的数据库或数据表说明配置成功。

        过程中如有错误,可以重制SLAVE,具体操作如下:

            STOP SLAVE;

            RESET SLAVE;

        随后再重新执行CHANGE MASTER TO语句即可。

        为从节点添加半同步复制

        MySQL主从通过二进制日志复制的机制导致了二者的异步,因此存在一定的概率主从数据的不一致。此外,再往深挖掘一下,在这种复制机制下,如果主服务器故障宕机,事务在主服务器上已提交,但很可能这些事务并没有传输到从服务器,换句话说,主服务器只管复制二进制日志到从服务器,却不关心从服务器是否收到以及所收到的二进制日志是否完整和正确。

        为了保持主从数据的一致性,就需要启用MySQL的半同步复制(semi-sync)。

        启用半同步复制后,主服务器除了要将自己的二进制日志发给从服务器,而且还要确保从服务器已经收到了这个日志,才会将数据反馈给客户端。虽然半同步复制对于客户的请求响应会稍微慢一点,但却保证了二进制日志的完整性。

        半同步复制特性启用十分简单,只需安装semi_sync_replication插件,稍做配置即可使用,具体实现方法如下:

        首先登录MySQL数据库,然后执行如下SQL语句加载半同步复制插件:

        MySQL A 

            >INSTALL PLUGIN rpl-semi-sync_master SONAME 'semisync-master.so';

        MySQL B 

            >INSTALL PLUGIN rpl-semi-sync-slave SONAME 'semisync_slave.so';

        成功加载此插件后可以通过如下SQL命令查 看插件是否加载成功:

            >SELECT PLUGIN_NAME,PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

+-------------------------------------------------+--------------------------------------------+

 |                    PLUGIN_NAME                             |                     PLUGIN_STATUS                  |

+-------------------------------------------------+--------------------------------------------+

 |                    rplsemisync-master                      |                          ACTIVE                            |

+-------------------------------------------------+--------------------------------------------+

  1 row in set (0.00 sec)

         可以看到插件且状态为活跃,需要更多信 息可以使用如下SQL语句:

            >SHOW PLUGINS\G

*********************************************** 45.row ***********************************************

        Name:rpl_semi_sync_slave 

        Status:ACTIVE

          Type:REPLICATION 

       Library:semisync_slave.so 

      License:GPL

 45 rows in set (0.00 sec)

        由于半同步复制默认是关闭的,所以加载 成功后还需要启用半同步复制并设置超时 时间就可以正常工作了,关键操作如下:

            MySOLA 

            >SET GLOBAL rpl_semi-sync_master_enabled= 1;

            >SET GLOBAL rpl_semi_sync_master_timeout= 1000;

            

            MySQL B 

                >SET GLOBAL rpl-semi-sync-slave-enabled= 1;

            

            启用后使用如下sQL语句重启Io线程:

                >STOP SLAVE IO_THREAD; 

                >START SLAVE IO_THREAD; 

            

            重启后,半同步复制既可以正常工作了。最后可以使用如下s 

            MySQL A 

            >SHOW STATUS LIKE 'Rpl_semi_sync_master_status';

             +---------------------------------+-------------+

              |             Variable_name             |     Value       |

             +---------------------------------+-------------+

              |   Rplsemi-sync-master-status  |       ON        | 

             +---------------------------------+-------------+

             1 row in set (0.00 sec)

             MySQLB

            >SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';

             +---------------------------------+-------------+

              |             Variable_name             |     Value       |

             +---------------------------------+-------------+

              |   Rplsemi-sync-master-status  |       ON        | 

             +---------------------------------+-------------+

             1 row in set (0.20 sec)

        上述两个变量可以监控主从服务器在半同步复制模式下的运行状态,看到ON表示半同步复制一切正常。在主从复制架构中启用半同步复制,虽然会损失一点性能,但换来的是主从服务器在数据同步和一致性方面的提高,大家可以根据自己的实际情况选择是否开启半同步功能。

    8.6实现双节点双主复制

        前面已经实现了双节点主从复制同步,但由于主从同步是先同步二进制日志,然后从服务器再根据同步好的二进制日志生成数据,所以主从服务器之间存在一定的延迟,虽然这个时间差很短,但万一就在这很短的时间内出现故障,依然存在数据丢失或不一致的风险,同时也有一些朋友采用DRBD(网络RAID1)来实现数据的同步和高可用,虽然目前通过DRBD同步数据已经比较安全,发生脑裂所导致的数据不一致是小概率事件,但如果对数据库服务可用性要求高的话,还是推荐采用Keepalived和MySQL的双主复制方式比较保险。

        在双节点双主复制高可用方案中,keepalived主要用于故障切换,即双节点中的一个节点发生故障,将实例立即切换到可用节点,保证数据库的高可用,而MySQL双主复制则是实现数据的冗余备份的主体,该模式下两台服务器互为主备,而主从复制模式则是一主一从或一主多从。

        下面就来实现双主复制,依旧采用主从复制的两台服务器配置,分别是:

            主机名IP地址/子网掩码

            MySQLA(主服务器):mysqla 192.168.1.172/24

            MySQLB(主服务器):mysqlb 192.168.1.173/24

            虚拟IP(VIP):192.168.1.200

        和主从配置类似,需要在MySQL A和MySQL B上的对replication用户进行授权:

        在MySQL A和MySQL B上分别执行如下SQL 语句:

            >GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.173' IDENTIFIED BY 'abc_ABC_123';

            >FLUSH PRIVILEGES; 

            >GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.172' IDENTIFIED BY 'abc_ABC_123';

            >FLUSH PRIVILEGES; 

        和主从服务类似,在MySQL A和MySQL B上分别执行如下SQL语句添加用户名,密码 和地址等信息信息,同样要使用'CHANGE MASTER TO'语句设置,在添加上述信息之前,先使用如下命令暂停从服务器的同步:

            STOP SLAVE; 

        然后根据主服务器的实际情况添加相应信息:

            MySQL A

            >CHANGE MASTER TO MASTER_HOST='192.168.1.173,

                    MASTER_USER='replication',

                    MASTER_PASSWORD='abc_ABC_123',

                    MASTER_LOG_FILE='mysql-bin.000001',    #此名称一定要为主服务器真实的名称,否则会报Last_IO_Errno错误

                    MASTER_LOG_POS=154;

            MySQL B

            >CHANGE MASTER TO MASTER_HOST='192.168.1.172,

                    MASTER_USER='replication',

                    MASTER_PASSWORD='abc_ABC_123',

                    MASTER_LOG_FILE='mysql-bin.000001',    #此名称一定要为主服务器真实的名称,否则会报Last_IO_Errno错误

                    MASTER_LOG_POS=154;


        服务器MySQL A的配置如下:

            vi /etc/my.cnf 

            [mysqld] 

            ……

            server-id=1 

            log-bin = /var/lib/mysql/mysql-bin 

            relay-log = /var/lib/mysql/relay-bin

            skip-slave-start = 1

            auto_increment_increment = 2 

            auto_increment_offset = 1

            ……

            服务器MySQL B的配置如下:

            vi/etc/my.cnf 

            ……

            [mysqld] 

            server-id  = 2

            log-bin = /var/lib/mysql/mysql-bin

            relay-log = /var/lib/mysql/relay-bin

            skip-slave-start = 1

            auto_increment_increment = 2 

            auto_increment_offset = 2

 

        成功配置后,分别重启MySQL服务后登录 数据库,分别在MySQLA和MySQL B上执行如下SQL语句:

            START SLAVE; 

        成功启动后,运行如下命令查看:

            MySQL A

            >SHOW SLAVE STATUS\G

*********************************************** 1.row ***********************************************

                                                    Slave-IO_State:Waiting for master to send event

                                                       Master_Host:192.168.1.173 

                                                        Master-User:replication 

                                                         Master_Port:3306 

                                                     Connect-Retry:60 

                                                   Master-Log-File:mysql-bin.000006 

                                         Read-Master-Log-Pos:154 

                                                      Relay-Log-File:relay-bin.000008 

                                                      Relay_Log-Pos:367 

                                          Relay-Master-Log-File:mysql-bin.000006 

                                                 Slave-IO-Running:Yes 

                                               Slave-SQL_Running:Yes

……

            MySQL B

            >SHOW SLAVE STATUS\G

*********************************************** 1.row ***********************************************

                                                    Slave-IO_State:Waiting for master to  send event

                                                       Master_Host:192.168.1.172 

                                                        Master-User:replication 

                                                         Master_Port:3306 

                                                     Connect-Retry:60 

                                                   Master-Log-File:mysql-bin.000007 

                                         Read-Master-Log-Pos:154 

                                                      Relay-Log-File:relay-bin.000008 

                                                      Relay_Log-Pos:367 

                                          Relay-Master-Log-File:mysql-bin.000007 

                                                 Slave-IO-Running:Yes 

                                               Slave-SQL_Running:Yes

……

        以及运行如下命令查看复制进程:

        MySQL A

        SHOW PROCESSLIST;

        MySQL B

        SHOW PROCESSLIST;

        完成后继续keepalived的配置。

    8.7.实现双节点双主复制并通过Keepalived实现高可用

        keepalived是通过虚拟路由器冗余协议(VRRP)实现的高可用。VRRP(Virtual Router Redundancy Protocol)是虚拟路由器元余协议的缩写(RFC3768),用来实现路由器的高可用,其工作原理简而言之就是将物理上一主一辅或一主多辅的节点虚拟成一个虚拟服务器,且该虚拟服务器具有一个虚拟IP(VIP),万一某个节点失效就自动飘移到有效的节点上,从而实现高可用,主要用于LVS和MySOL等对高可用性要求较高的环境,其安装和配置都十分简 单,在MySQL A和MySQL B上分别执行如 下命令:

            dnf install keepalived -y 

        配置keepalived只需在MySQL A和MySQL B上分别创建MySQL健康检测脚本,脚本代码如下:

            vi /sbin/mysqld_check.sh 

            #!/bin/bash 

            #Checking mysqld is alive or not         #检测mysqld进程是否存活的脚本

            COUNTER=`ps -C mysqld --no-heading | wc -l`         #--no-heading参数将忽略表头只显示mysqld的进程个数

            if [[ "${COUNTER}" = "0" ]] 

                    then 

                            systemctl stop keepalived         #如果mysqld进程停止运行,进程数为0,则关闭keepalived进程,另外一个节点接管虚拟服务器

            fi 

            

            添加执行权限:

           chmod u+x /sbin/mysqld_check.sh

        Keepalived高可用集群主要有两种模式,第一种为抢占模式,即如果集群有两个节点,其中一台设置为主节点(master),另外一个节点设置为从节点(backup),当主节点出现异常,从节点自动变身为主节点,一旦主节点恢复正常,将会再次变回为主节点,也就是说如果主节点故障就存在主从节点切换。第二种是非抢占模式,即将主从节点初始状态均设置为backup,然后设置不同的优先级,万一主节点出现故障切换到从节点,故障恢复后主节点就成为从节点,从而避免了主从节点的无谓切换的麻烦,这里就采用此模式来实现MySQL数据库的高可用,具体实现方式如下。

            cp /etc/keepalived/keepalived.conf keepalived.conf.bak

            vi /etc/keepalived/keepalived.conf

        MySQL A配置文件如下:

            !Configuration File for keepalived             #固定格式,必须保留

            global_defs {                                             #Keepalived全局配置

                        notification_email { 

                                [email protected]             #设置管理员邮箱地址,便于收取keepalived发出的提示信息

                        }

                        notification_email_from [email protected]         #设置发件人地址

                        smtp_server smtp.gmail.com             #指定smtp服务器,本机最好配置smtp服务,设置为127.0.0.1即可

                        smtp_connect_timeout 30 

                        router_id mysqla                         #router-id必须唯一,这里设置为当前主机名

            } 

            vrrp_sync_group db_vsg {                         #定义VRRE实例组,本例比较简单只有一个VRRP实例

                        group { 

                                        mysql_ha                     #VRRE实例名称

                        } 

            }

            vrrp_script check_mysqld {                 #VRRP脚本配置,指定健康检测脚本的绝对路径,用于监控mysqld进程的运行状态

                    script "/sbin/mysqld_check.sh"

                    interval 1                                         #定义运行健康检测脚本的间隔时间为1秒

            }

            vrrp_instance mysql_ha {                 #定义VRRP实例

                        state BACKUP                 #不抢占VIP地址

                        nopreempt                     #配置为非抢占,避免无谓的主从切换

                        interface ens33             #网络接口名称,需要注意的是,Centos6和Centos 7/8差别巨大 

                        virtual_router_id 66         #VPID标记为66,主从要一致

                        priority 100                    #优先级设置为100,非抢占模式以优先级的高低确定主从

                        advert_int 1                 #主备之间的心跳间隔秒数

                        authentication { 

                                        auth_type PASS             #指定认证方式为密码

                                        auth_pass 12345678         #定义认证密码

                        }

                        virtual_ipaddress {                 #定义和配置虚拟服务器

                                    192.168.1.200             #设置虚拟IP的具体地址,可设置多个VIP,并且可以指定端口,如192.168.1.100 80

                        }

                        track_script {                 #设置VRRP脚本定义字段名为check-mysqld,并通过该字段所定义的路径和脚本名称找到MySOL健康检测脚本

                                check_mysqld

                        }

            }

            MySQL B配置文件如下:

            !Configuration File for keepalived 

            global_defs { 

                        notification_email { 

                                [email protected] 

                        }

                        notification_email_from keepalived@g 

                        smtp_server smtp.gmail.com 

                        smtp_connect_timeout 30 

                        router_id mysqlb 

            } 

            vrrp_sync_group db_vsg { 

                        group { 

                                        mysql_ha 

                        } 

            }

            vrrp_script check_mysqld { 

                    script "/sbin/mysqld_check.sh"

                    interval 1 

            }

            vrrp_instance mysql_ha { 

                        state BACKUP 

                        interface ens33 

                        virtual_router_id 66 

                        priority 80

                        advert_int 1 

                        authentication { 

                                        auth_type PASS 

                                        auth_pass 12345678 

                        }

                        virtual_ipaddress { 

                                    192.168.1.200 

                        }

                        track_script { 

                                check_mysqld

                        }

            }

        配置好所有节点后,运行如下命令启动keepalived:

            systemctl restart keepalived 

        然后运行如下命令查看keepalived的状态:

            systemctl status keepalived 

        最后运行如下命令检测集群的VIP:

            ping 192.168.1.200

        本章小结

        MySQL号称世界上最为流行的开源数据库,近些年来越来越流行和普及,本章深入全面地介绍了MySQL数据库在生产环境的两种部署方法及多实例部署和配置方法,并掌握其使用和管理方法以及最新的变化。此外,更进一步帮助搭建掌握了MySQL高可用主从复制集群及双主复制集群的部署和配置方法,通过本章的学习,可以掌握MySQL的生产环境的基础,为进一步的企业环境更为复杂的应用打好基础。

    EOF

        扩展阅读

        官方MySQL手册

        http://imysql.com/mysql-refman/5.7/index.html

        What You Need to Know About the MariaDB&Percona Forks of MySQL

        What You Need to Know About the MariaD B&Percona Forks of MySQL

        https://blog.appdynamics.com/database/what-you-need-to-know-about-the-mariadb-percona-forks-of-mysql/

        15 Useful MySQL/MariaDB Performance Tuning and Optimization Tips 

        http://www.tecmint.com/mysql-mariadb-p erformance-tuning-and-optimization/ 

        Your Options for Optimizing the Performan ce of MySQL Databases 

        https://www.morpheusdata.com/blog/2015-01-22-your-options-for-optimizing-the-performance-of-mysql-databases 

        

        参考文献 

        https://en.wikipedia.org/wiki/MySQL 

        http://dev.mysql.com/doc/refman/5.0/en/innodb-storage-engine.html 

        https://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html 

        https://www.percona.com/doc/percona-server/5.7/tokudb/tokudb_installation.html 

        https://www.percona.com/software/percona-server/percona-xtradb 

        https://www.percona.com/blog/2010/01/13/innodb-innodb-plugin-vs-xtradb-on-fast-storage/ 

        https://www.percona.com/blog/2019/05/31/rhel-8-packages-available-for-percona-products/ 

版权声明:
作者:WaterBear
链接:https://l-t.top/571.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>