zookeeper+disconf+mysql主从搭建总结

之前接触过disconf,最近发现现在系统的配置文件比较混乱(也不是混乱,就是不好管理),测试服务器一套,到正式环境又需要另外一套,有时候因为忘记修改配置文件调用地址或者从配置文件获取参数就会有问题。

所以打算搭建一个disconf服务器,分布式管理配置文件。
主要参考:https://blog.csdn.net/qq_37598011/article/details/93619525

准备了两台Linux,46 和48,看教程好像搭建集群的需要三台,所以先搭建了单机版的服务。

首先下载了一堆配置环境需要的东西,一点一点来总结:
在这里插入图片描述

1、mysql

下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads

比较大,下载比较慢

上传到机器之后,解压

tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar 

我下载的版本不是x86 下成了i686,这样后续初始化会有一些问题,不过也可以解决。

解压会出一堆这样的日志,一会就好了
在这里插入图片描述

接下来就是移动并重命名一下,

扫描二维码关注公众号,回复: 8777602 查看本文章
mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql

在这里插入图片描述

创建MySQL用户组和用户并修改权限

1. groupadd mysql
2. useradd -r -g mysql mysql

如果出现already exist的情况,没有关系,就是这个机器之前创建过MySQL用户组

创建数据目录并赋予权限

1. mkdir -p  /data/mysql              #创建目录
2. chown mysql:mysql -R /data/mysql   #赋予权限

接下来修改配置文件,我还遇到了这个配置文件没有的情况,执行命令之后 new File

vim /etc/my.cnf

内容如下:

[mysqld]

bind-address=0.0.0.0

port=3306

user=mysql

basedir=/usr/local/mysql

datadir=/data/mysql

socket=/tmp/mysql.sock

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

pid-file=/data/mysql/mysql.pid

\#character config

character_set_server=utf8mb4

symbolic-links=0

explicit_defaults_for_timestamp=true

在这里插入图片描述

接下来初始化数据库

进入到MySQL的bin目录:

cd /usr/local/mysql/bin/

执行初始化命令:

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

这里我遇到了问题:
在这里插入图片描述

缺少了包,如果安装x86应该不会有这种问题

搜索之后
在这里插入图片描述

yum install libnuma.so.1

接着报错:
在这里插入图片描述

这就可以看出来是版本对应不上
在这里插入图片描述

执行命令的时候在后边加上 --setopt=protected_multilib=false

再执行就可以了

我们需要修改数据库的密码

可以通过这个指令查看密码,是个随机生成的字符串

cat /data/mysql/mysql.err

在这里插入图片描述

启动MySQL,并修改密码:

先将mysql.server放置到/etc/init.d/mysql中

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

启动!!!

service mysql start
./mysql -u root -p   #bin目录下

在这里插入图片描述

1. SET PASSWORD = PASSWORD('123456');
2. ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
3. FLUSH PRIVILEGES;

在这里插入图片描述

如果现在通过工具连接不上数据库了,则需要执行以下命令:

use mysql      #访问mysql库
update user set host = '%' where user = 'root';      #使root能再任何host访问
FLUSH PRIVILEGES;   

在这里插入图片描述

如果不希望每次都到bin目录下使用mysql命令则执行以下命令

ln -s  /usr/local/mysql/bin/mysql    /usr/bin

2、jdk

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载一个Linux .tar.gz的版本

在这里插入图片描述

上传到服务器上

解压

tar zxvf jdk-8u201-linux-x64.tar.gz 

进入到解压后的目录,执行

pwd

在这里插入图片描述

记住这个命令,一会要用

使用vi编辑器,设置环境变量:

sudo vi /etc/profile

加入以下内容:

1. export JAVA_HOME=/opt/rh/jdk1.8.0_231
2. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
3. export PATH=$PATH:$JAVA_HOME/bin

执行命令是环境生效

source /etc/profile

但是我遇到的问题是,输入java -version之后显示的一直都是

在这里插入图片描述

不过这个没有影响我使用

3、zookeeper

wget http://apache.fayea.com/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

直接执行可以下载zookeeper

解压:

tar -zxvf zookeepre-3.4.13.tar.gz

进入解压之后的目录,创建data目录

cd zookeeper-3.4.13

mkdir data

进入conf目录下

cd conf/

将zoo_sample.cfg复制一份并重命名为zoo.cfg:

cp zoo_sample.cfg zoo.cfg

修改zoo.cfg中dataDir路径为刚刚创建的data:

 vim zoo.cfg 

在这里插入图片描述

进入bin目录

 cd ../bin/

启动zkServer.sh:

./zkServer.sh start

查看状态

./zkServer.sh status

在这里插入图片描述

输入jps:
在这里插入图片描述
输入jps能正常出现,需要有java环境,也就是需要先安装jdk

4.nginx

首先需要安装4个依赖

yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

下载

wget http://nginx.org/download/nginx-1.14.2.tar.gz  

解压

tar zxvf nginx-1.14.2.tar.gz 

进入到解压后的目录

先执行

./configure

然后编译安装,执行以下两个指令

make
make install

修改配置文件,这里先修改监听的端口

vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

启动Nginx

进入sbin目录,这里我还找了一会,忘记了已经更换了目录了

cd /usr/local/nginx/sbin
./nginx

测试Nginx有没有起来

curl localhost:8085

在这里插入图片描述

这样说明已经起来了

需要外部访问则需要关闭防火墙

1. systemctl stop iptables.service   #centOS6及以前版本使用命令
2. systemctl stop firewalld.service  #centOS7关闭防火墙命令

Nginx常用命令:

1. ./nginx             #启动
2. ./nginx -s stop     #关闭
3. ./nginx -s reload   #重启

5、redis

安装redis之前要先安装c/c++环境

yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake

下载

wget http://download.redis.io/releases/redis-4.0.10.tar.gz

解压

tar xzf redis-4.0.10.tar.gz 

进入解压后的目录,编译

make

修改配置文件,找到在文件中对应的位置,作相应的修改即可

1. #bind 127.0.0.1     #将改行注释
2. daemonize yes       #将后台运行设为yes
3. protected-mode no   #将安全模式设为no

运行服务端

进入到redis的src目录

./redis-server  ../redis.conf

在这里插入图片描述

可以看到redis已经启动了

6、tomcat

下载

wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.41/bin/apache-tomcat-8.5.41.tar.gz

解压

tar -zxvf apache-tomcat-8.5.41.tar.gz 

进入到bin目录

启动

./startup.sh

直接访问tomcat可以看到tomcat正常启动

7、maven

下载和安装

wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

yum -y install apache-maven

可以通过mvn -v 查看是否安装成功和安装版本

8、git

yum -y install git

可以通过git -version查看是否安装成功和安装版本

至此,单机版的环境已经准备好了,可以down代码了

首先需要三个目录

 mkdir -p /usr/local/disconf/{resource,src,war}

然后进入到disconf目录下的src中

git clone https://github.com/knightliao/disconf.git

将/usr/local/disconf/src/disconf/disconf-web/profile/rd 路径下的配置文件拷贝到 /usr/local/disconf/resource中

cp /usr/local/disconf/src/disconf/disconf-web/profile/rd/* /usr/local/disconf/resource/

然后到/usr/local/disconf/resource目录下

cd /usr/local/disconf/resource/

将application-demo.properties文件改名重命名为application.properties

mv application-demo.properties application.properties 

接下来要修改项目中的配置文件了,具体为啥不直接在Git上存储正确的咱也不知道

这里需要修改相应的4个配置文件(application.properties、zoo.properties、redis-config.properties 、jdbc-mysql.properties )

vim application.properties 

在这里插入图片描述

vim zoo.properties

在这里插入图片描述

这里有个坑,hosts不能用127.0.0.1如果你是在本地测试这回导致zk实例为空!!!!

我也用了127.0.0.1 确实不行

vim redis-config.properties 

在这里插入图片描述

vim jdbc-mysql.properties

在这里插入图片描述
接下来修改环境配置

这里需要把创建的配置文件的路径和war包的路径配置在环境变量中。

vim /etc/profile

需要添加的内容:

1. ONLINE_CONFIG_PATH=/usr/local/disconf/resource
2. WAR_ROOT_PATH=/usr/local/disconf/war
3. export ONLINE_CONFIG_PATH
4. export WAR_ROOT_PATH

使配置生效

source /etc/profile

除此之外还需要修改disconf-web下的pom文件(如果JDK的版本低于1.8,则此步骤不需要执行)

vim /usr/local/disconf/src/disconf/disconf-web/pom.xml 

需要添加的内容:

<profile>

​    <id>doclint-java8-disable</id>

​    <activation>

​      <jdk>[1.8,)</jdk>

​    </activation>

​    <build>

​      <plugins>

​        <plugin>

​          <groupId>org.apache.maven.plugins</groupId>

​          <artifactId>maven-javadoc-plugin</artifactId>

​          <configuration>

​            <additionalparam>-Xdoclint:none</additionalparam>

​          </configuration>

​        </plugin>

​      </plugins>

​    </build>

  </profile>

接下来就要构建了,这里不能使用maven中的构建,会报错

执行该命令(disconf-web下的deploy目录中的deploy.sh)

这里需要的时间比较长,可以边构建边修改tomcat和Nginx的配置

先进入到 /usr/local/disconf/src/disconf/disconf-web目录下

在这里插入图片描述

一定要在这个目录下!!!因为deploy.sh这个脚本中有说明,必须要在这个目录下执行
在这里插入图片描述

sh deploy/deploy.sh

然后就是漫长的等待,如果觉得用maven官方的下载比较慢,可以才maven的配置,用阿里云或者华为云的来下载

在下载这个的过程中,重新打开一个窗口,修改tomcat和Nginx的配置

Tomcat配置修改

将构建时打成的war包部署到Tomcat中,需要修改Tomcat的server.xml文件

先到Tomcat的配置目录,再通过vim进行修改

cd /opt/rh/apache-tomcat-8.5.50/conf
vim server.xml

修改的内容如下

<Context path="" docBase="/usr/local/disconf/war"></Context>

在这里插入图片描述

在构建完成disconf项目之后需要重启tomcat

进入tomcat的bin目录

./shutdown.sh
./start.sh

Nginx配置修改

这里主要是配置了端口和静态加载页面的地址

我的配置文件如下:

\#user  nobody;

worker_processes  1;

 

\#error_log  logs/error.log;

\#error_log  logs/error.log  notice;

\#error_log  logs/error.log  info;

 

\#pid        logs/nginx.pid;

 

 

events {

​    worker_connections  1024;

}

 

 

http {

​    include       mime.types;

​    default_type  application/octet-stream;

 

​    \#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

​    \#                  '$status $body_bytes_sent "$http_referer" '

​    \#                  '"$http_user_agent" "$http_x_forwarded_for"';

 

​    \#access_log  logs/access.log  main;

 

​    sendfile        on;

​    \#tcp_nopush     on;

 

​    \#keepalive_timeout  0;

​    keepalive_timeout  65;

 

​    \#gzip  on;

​	

 

​    upstream disconf {

​	    server 127.0.0.1:8080; #Tomcat的IP和端口号}

 

​    server {

​        listen       8085;

​        server_name  localhost; #这块要和application.properties中的domain属性相同

​	access_log /usr/local/disconf/access.log;

​        error_log /usr/local/disconf/error.log;

​	

​        \#charset koi8-r;

 

​        \#access_log  logs/host.access.log  main;

 

​        location / {

​                root /usr/local/disconf/war/html;   #html所在的路径if ($query_string) {

​           	 expires max;}}

 

​    location ~ ^/(api|export) {

​        proxy_pass_header Server;

​        proxy_set_header Host $http_host;

​        proxy_redirect off;

​        proxy_set_header X-Real-IP $remote_addr;

​        proxy_set_header X-Scheme $scheme;

​        proxy_pass http://disconf;}

 

​        \#error_page  404              /404.html;

 

​        \# redirect server error pages to the static page /50x.html

​        \#

​        error_page   500 502 503 504  /50x.html;

​        location = /50x.html {

​            root   html;}

 

​        \# proxy the PHP scripts to Apache listening on 127.0.0.1:80

​        \#

​        \#location ~ \.php$ {

​        \#    proxy_pass   http://127.0.0.1;

​        \#}

 

​        \# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

​        \#

​        \#location ~ \.php$ {

​        \#    root           html;

​        \#    fastcgi_pass   127.0.0.1:9000;

​        \#    fastcgi_index  index.php;

​        \#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

​        \#    include        fastcgi_params;

​        \#}

 

​        \# deny access to .htaccess files, if Apache's document root

​        \# concurs with nginx's one

​        \#

​        \#location ~ /\.ht {

​        \#    deny  all;

​        \#}}

 

 

​    \# another virtual host using mix of IP-, name-, and port-based configuration

​    \#

​    \#server {

​    \#    listen       8000;

​    \#    listen       somename:8080;

​    \#    server_name  somename  alias  another.alias;

 

​    \#    location / {

​    \#        root   html;

​    \#        index  index.html index.htm;

​    \#    }

​    \#}

 

 

​    \# HTTPS server

​    \#

​    \#server {

​    \#    listen       443 ssl;

​    \#    server_name  localhost;

 

​    \#    ssl_certificate      cert.pem;

​    \#    ssl_certificate_key  cert.key;

 

​    \#    ssl_session_cache    shared:SSL:1m;

​    \#    ssl_session_timeout  5m;

 

​    \#    ssl_ciphers  HIGH:!aNULL:!MD5;

​    \#    ssl_prefer_server_ciphers  on;

 

​    \#    location / {

​    \#        root   html;

​    \#        index  index.html index.htm;

​    \#    }

​    \#}

 

}

在这里插入图片描述

同样需要重启Nginx

cd /usr/local/nginx/sbin
./nginx -s reload

就可以正常访问静态页面了

我们还需要导入MySQL

初始化数据库

先进到/usr/local/disconf/src/disconf/disconf-web/sql目录下

cd /usr/local/disconf/src/disconf/disconf-web/sql

执行以下几条命令,要按照顺序

mysql -h127.0.0.1 -uroot -p'123456' < 0-init_table.sql 
mysql -h127.0.0.1 -uroot -p'123456' disconf < 1-init_data.sql
mysql -h127.0.0.1 -uroot -p'123456' disconf < 201512/20151225.sql    
mysql -h127.0.0.1 -uroot -p'123456' disconf < 20160701/20160701.sql 

这里我还需要了问题,我没有把mysql命令放到/usr/bin目录下,如下

在这里插入图片描述

用admin admin登陆就OK啦!

单机版的至此就搭建完成。

zookeeper集群搭建

首先我在 46 和48 两个机器上各搭建了一套disconf服务,这时候需要做集群,当然一般都是单数个机器做集群,因为zookeeper有一半以上机器可用的时候才能正常运行,有一半宕机就全部不可以访问了。我们资源有限,暂时只有两个,只是用来实践如何搭建zookeeper集群。

首先,和单机版不同是zookeeper的配置文件

vi zoo.cfg,修改

在这里插入图片描述

增加了

server.1=0.0.0.0:2888:3888 
server.2=18.0.0.48:2888:3888 
以及quorumListenOnAllIPs=true

至于本机用0.0.0.0 以及添加了 quorumListenOnAllIPs=true是为了避免两个机器不能互通

这里要注意下server.1这个后缀,表示的是0.0.0.0这个机器,在机器中的server id是1

在zookeeper的data目录中创建myid,每个文件中分别写入当前机器的server id

在data目录下执行命令:

echo 1 > myid

进入zookeeper 的bin目录,启动

./zkServer.sh start

这时候查看日志应该会报错,因为第二个机器的zookeeper还没有启动

然后到18.0.0.48机器,同样修改zoo.cfg文件

增加了

server.1=18.0.0.46:2888:3888 
server.2=0.0.0.0:2888:3888 
以及quorumListenOnAllIPs=true

在zookeeper的data目录中创建myid,每个文件中分别写入当前机器的server id

在data目录下执行命令:

echo 2 > myid

进入zookeeper 的bin目录,启动

./zkServer.sh start

这时候切换到18.0.0.46中

重新启动 zookeeper即可

./zkServer.sh restart

查看是否成功

echo stat|nc localhost 2181

在这里插入图片描述

在这里插入图片描述

应该是有follower 有leader,是哪个都无所谓

至此,zookeeper集群搭建完成

接下来是MySQL主从搭建

mysql数据库主从配置

1、配置主库:

修改my.cnf文件,在[mysqld]加入下面的内容:
在这里插入图片描述

\# 服务的唯一编号

server-id=1

\# 开启mysql binlog功能

log-bin=mysql-bin

\# binlog记录内容的方式,记录被操作的每一行

binlog_format=ROW

\# 减少记录日志的内容,只记录受影响的列

binlog_row_image=minimal

\# 指定需要复制的数据库名为jgyw

binlog-do-db=disconf

修改好配置文件之后需要重启MySQL服务

service mysqld restart

创建从库同步数据的账号

grant replication slave on *.* to 'root'@'18.0.0.48' identified by '123456';flush privileges;

注意:上面这两个命令是在mysql的终端执行的。

show master status\G;

在这里插入图片描述

这样就是可以的

2、配置从库

修改my.cnf文件,在[mysqld]加入下面的内容:

在这里插入图片描述

\# 服务的唯一编号

server-id=2

\# 开启mysql binlog功能

log-bin=mysql-bin

\# binlog记录内容的方式,记录被操作的每一行

binlog_format=ROW

\# 减少记录日志的内容,只记录受影响的列

binlog_row_image=minimal

\# 指定需要复制的数据库名为disconf

replicate-do-db=disconf

同样重启MySQL服务

service mysqld restart

执行同步命令

mysql的终端执行:

\# 设置主服务器ip,同步账号密码,同步位置
change master to master_host='18.0.0.46',master_user='root',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=2380;
# 开启同步功能start slave;
flush privileges;

注意,这个master_log_file要与主库保持一致,一会会讲不一致会怎样

查看从库状态:

show slave status\G;

在这里插入图片描述

如果master_log_file与主库不一致,就可能导致这两个其中一个为No

在这里插入图片描述

有几种解决方法:

如果是Slave_SQL_Running:no:

MariaDB [(none)]> stop slave;                                                      
MariaDB [(none)]> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;            MariaDB [(none)]> start slave;                                                      MariaDB [(none)]> show slave status\G  

如果是slave_io_running:no

MariaDB [(none)]> show master status\G     

在这里插入图片描述

file 的名字 和从库的名字不一致的话,发现Master_Log_File没有对应。

在从库上操作:

MariaDB [(none)]> slave stop;                 
MariaDB [(none)]>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;  MariaDB [(none)]> slave start;                               MariaDB [(none)]> show slave status\G    

这时名字要保持一致

启动disconf之后出现了报错,

Access denied for user 'root'@'%' to database 'mytest'

发现是user表中’root’@’%’没有grant的权限

可以用如下命令查看:

select host,user,Grant_priv,super_priv from mysql.user;

在这里插入图片描述

update mysql.user set Grant_priv='Y',Super_priv='Y' where user = 'root' and host = '%';
flush privileges;

如果对应的host和user 都是N的话,改为Y,然后重启mysql

后来我又出现了报错:

在这里插入图片描述

我就把 对应host和user的权限都放开了

在这里插入图片描述

全改为Y了,增删改查权限是前4个。

MariaDB [(none)]> show slave status\G  

如果是slave_io_running:no

MariaDB [(none)]> show master status\G       

在这里插入图片描述

file 的名字 和从库的名字不一致的话,发现Master_Log_File没有对应。

在从库上操作:

MariaDB [(none)]> slave stop;                 
MariaDB [(none)]>CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;  
MariaDB [(none)]> slave start;                              
MariaDB [(none)]> show slave status\G

这时名字要保持一致

启动disconf之后出现了报错,

Access denied for user 'root'@'%' to database 'mytest'

发现是user表中’root’@’%’没有grant的权限

可以用如下命令查看:

select host,user,Grant_priv,super_priv from mysql.user;

在这里插入图片描述

update mysql.user set Grant_priv='Y',Super_priv='Y' where user = 'root' and host = '%';
flush privileges;

如果对应的host和user 都是N的话,改为Y,然后重启mysql

后来我又出现了报错:

在这里插入图片描述

我就把 对应host和user的权限都放开了

在这里插入图片描述

全改为Y了,增删改查权限是前4个。

测试的话就可以在主数据库中新建表或者插入数据,到从库中查看都同步了。

有什么问题或者错误可以及时沟通~
有些内容来源于网络,如有侵犯请及时联系~

发布了9 篇原创文章 · 获赞 1 · 访问量 113

猜你喜欢

转载自blog.csdn.net/qq_41782623/article/details/103912342