之前接触过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,这样后续初始化会有一些问题,不过也可以解决。
解压会出一堆这样的日志,一会就好了
接下来就是移动并重命名一下,
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个。
测试的话就可以在主数据库中新建表或者插入数据,到从库中查看都同步了。
有什么问题或者错误可以及时沟通~
有些内容来源于网络,如有侵犯请及时联系~