Spark 如何写入Redis/MySQL/Kafka

E-Card新数据系统确定用spark+kafka+zookeeper+redis+mysql的基本架构,redis+mysql的存储方式是之前一直在用的,这里不存在问题,这里只看spark如何写入redis,进行交互,一直疑惑这样的数据架构是否会遭遇瓶颈,所以必须先把一些相关的概念理清先。

多个TOPIC分布在多个Broker中
每个TOPIC的数据以分区的方式分布在多个Broker中
一个分区同时只能被一个Consumer消费
同一个TOPIC允许被不同的Group重复消费,Group内不允许重复消费
详情:http://spark.apache.org/docs/1.5.0/streaming-kafka-integration.html

后面接着写。^-^

一则MySQL主从复制故障的排查

因为之前的运维要离职,这两天正在做交接,故障一个接一个,谁能告诉我这是不是坑?

上午开发说主从复制挂了,话说我还没交接到数据库这部分,各种原因只能我来排查。

不管3721,登陆主库先备份一下再说,保险万一!

- 阅读剩余部分 -

zabbix3.0安装之环境部署篇

这两天为公司部署zabbix,用了一台闲置的Dell Power Edge,系统是全新安装的,所以基本环境都要部署,就记录一下过程。

zabbix需要MySQL和Web环境的支持,可选lamp或者lnmp,这里我选择了后者,所以要先部署Nginx、PHP、MySQL,MySQL的编译安装,前面已经单独写过了,我个人也比较不喜欢cmake的编译方式,这里就不再赘述了。好了,下面开工!

准备编译环境

1)更换yum源为阿里云镜像

 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
 yum makecache

2)设置时区和时间同步

 yum -y install ntpdate
 echo "00 4 * * * /usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1" >> /var/spool/cron/root

对zabbix来说,正确的时间尤为重要,是保证监控和警报及时的前提!切记!

3)安装各种依赖

yum install -y gcc gcc-c++ make pcre* openssl* cmake ncurses-devel gd-devel libjpeg-devel libpng-devel libxml2-devel bzip2-devel libcurl-devel

因为我的Centos是mini安装的,大部分依赖都没有装,如果你不确定,那么也安装一遍吧。

1、Nginx编译安装

我事先准备了程序包,所以直接解压开始。

 cd /usr/local/src/
 tar zxvf nginx-1.8.1.tar.gz
 cd nginx-1.8.1
 ./configure --prefix=/usr/local/nginx-1.8.1 --with-http_ssl_module --with-http_spdy_module --with-http_stub_status_module --with-pcre

nginx编译成功

如上图,编译成功,执行安装。

make && make install
 [root@web nginx-1.8.1]# /usr/local/nginx-1.8.1/sbin/nginx
 [root@web nginx-1.8.1]# curl -s http://localhost |grep nginx.com
 <a href="http://nginx.com/">nginx.com</a>.</p>

可以看到,nginx已经成功运行。至此,nginx先告一段落,等待PHP安装好后再配置nginx和php的连接。

/usr/local/nginx-1.8.1/sbin/nginx -s stop  #停止nginx
/usr/local/nginx-1.8.1/sbin/nginx -s reload  #重载nginx

2、PHP编译安装

tar zxvf php-5.6.22.tar.gz
 cd php-5.6.22

./configure --prefix=/usr/local/php-5.6.22 --with-config-file-path=/usr/local/php-5.6.22/etc --with-bz2 --with-curl --enable-sockets --disable-ipv6 --with-gd --with-jpeg-dir=/usr/local --with-png-dir=/usr/local --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-iconv-dir=/usr/local --enable-mbstring --enable-calendar --with-gettext --with-libxml-dir=/usr/local --with-zlib --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-mysql=mysqlnd --enable-dom --enable-xml --enable-fpm --with-libdir=lib64 --enable-bcmath

php编辑成功

PS:我用的是64位的Centos,所以带上--with-libdir=lib64,如果是32位系统,忽略即可。如果你不明确该用哪些参数,请参照上面的。

执行安装:

make && make install

配置php.ini和php-fpm:

cp php.ini-production /usr/local/php-5.6.22/etc/php.ini
cp /usr/local/php-5.6.22/etc/php-fpm.conf.default /usr/local/php-5.6.22/etc/php-fpm.conf
 sed -i "s/;date.timezone =/date.timezone = Asia\/Shanghai/g" /usr/local/php/etc/php.ini
 sed -i "s#max_execution_time = 5#max_execution_time = 300#g" /usr/local/php/etc/php.ini
 sed -i "s#post_max_size = 8M#post_max_size = 32M#g" /usr/local/php/etc/php.ini
 sed -i "s#max_input_time = 60#max_input_time = 300#g" /usr/local/php/etc/php.ini
 sed -i "s#memory_limit = 128M#memory_limit = 128M#g" /usr/local/php/etc/php.ini
 sed -i "/;mbstring.func_overload = 0/ambstring.func_overload = 1\n" /usr/local/php/etc/php.ini
 sed -i "/;always_populate_raw_post_data = -1/aalways_populate_raw_post_data = -1\n" /usr/local/php/etc/php.ini
 #将配置写入php.ini,也可以手动编辑

3、MySQL编译安装

参照《编译安装MySQL 5.5》

4、Nginx+PHP

不出意外,做完上面这些,已经花了你大半天时间了,还是休息下吧。下一篇接着写nginx和php的连接,以及zabbix的安装和部署。

另起一篇,请看zabbix安装之PHP+Nginx篇

 

解决MySQL备份时出现“Using a password on the command line interface”

今天给博客做了个自动备份的脚本,脚本是以前就写好并且一直在生产环境使用的,直接套上去就用了。结果看到这样的错误提示:Using a password on the command line interface

mysql错误

前面说了,脚本肯定是没问题的,那么错误是怎么来的呢?字面理解的意思是在命令行使用密码是不安全的。额,这是个警告信息,其实数据库备份是成功的,没有问题的。没办法呀,强迫症不能忍呀。百度之!

原来这是MySQL5.6版本才会有的安全警告,而我用的是最新的5.7.11,所以。。。

mysql5.7.11

查帮助找到:

MySQL users should use the following guidelines to keep passwords secure.
When you run a client program to connect to the MySQL server, it is inadvisable to specify your password in a way that exposes it to discovery by other users. The methods you can use to specify your password when you run client programs are listed here, along with an assessment of the risks of each method. In short, the safest methods are to have the client program prompt for the password or to specify the password in a properly protected option file.

Store your password in an option file. For example, on Unix, you can list your password in the [client] section of the .my.cnf file in your home directory:

本人英语很烂,看懂了个大概,配合翻译得出结论:使用命令行的时候可以在得到提示后输入密码,或者在指定的安全文档内输入密码,至于那个安全文档,上面也给出了答案,就是my.cnf了。

所以,

vim /etc/my.cnf
host=localhost
user=数据库用户
password='数据库密码'

在[client]部分加上你的user和password就可以了。

如果你不想修改也没关系,用以下命令操作mysql即可。

导出:

mysqldump --defaults-extra-file=/etc/my.cnf database > database.sql

导入:

mysql --defaults-extra-file=/etc/my.cnf database < database.sql

聪明的你肯定已经发现不同了。
所以再说一次,生产环境下,推荐MySQL5.5版本!关于5.5的编译安装可以看我的另一篇博文《编译安装MySQL 5.5》。

zabbix3.0安装之MySQL 5.5篇

目前,5.5版本是很多大公司的首选,个人建议生产环境下选择这个版本,当然了,大多数情况下不是我们说了算,是开发,他们可能更偏爱5.1或者5.2,有时候说服开发也是个挺头疼的事。

确认当前环境,以下以opdev.me自用的腾讯云学生机为例。

[root@VM_31_225_centos ~]# uname -rn
VM_31_225_centos 2.6.32-504.30.3.el6.x86_64
[root@VM_31_225_centos ~]#
下载MySQL5.5安装源,我们选择从官方下载。
[root@VM_31_225_centos ~]# cd /usr/local/src/
[root@VM_31_225_centos ~]# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.45-linux2.6-x86_64.tar.gz
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql -p
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql/data -p
[root@VM_31_225_centos ~]# mkdir /usr/local/mysql/tmp -p
安装cmake及依赖。
[root@VM_31_225_centos ~]# yum -y install cmake ncurses-devel
解压安装源。
[root@VM_31_225_centos ~]# tar xf mysql-5.5.45.tar.gz
进入正题,编译安装!
[root@VM_31_225_centos ~]# cd mysql-5.5.45
[root@VM_31_225_centos mysql-5.5.45]# cmake . \
> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.45 \
> -DMYSQL_DATADIR=/usr/local/mysql-5.5.45/data \
> -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.45/tmp/mysql.sock \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DWITH_FEDERATED_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
> -DWITHOUT_PARTITION_STORAGE_ENGINE=1 \
> -DWITH_ZLIB=bundled \
> -DWITH_READLINE=1 \
> -DWITH_EMBEDDED_SERVER=1 \

...
-- Configuring done
-- Generating done
-- Build files have been written to: /usr/local/src/mysql-5.5.45
[root@VM_31_225_centos mysql-5.5.45]#

[root@VM_31_225_centos mysql-5.5.45]# make
...
[100%] Built target my_safe_process
[root@VM_31_225_centos mysql-5.5.45]#

[root@VM_31_225_centos mysql-5.5.45]# make install


安装完成后创建mysql用户。

[root@VM_31_225_centos mysql-5.5.45]# useradd -s /sbin/nologin -M mysql
[root@VM_31_225_centos mysql-5.5.45]# id mysql
uid=500(mysql) gid=500(mysql) groups=500(mysql)
[root@VM_31_225_centos mysql-5.5.45]# 
加入系统变量,更改目录属性
[root@VM_31_225_centos mysql-5.5.45]# ln -s /usr/local/mysql-5.5.45/ /usr/local/mysql
[root@VM_31_225_centos mysql-5.5.45]# echo 'export PATH=/usr/local/mysql/bin/:$PATH'>>/etc/profile
[root@VM_31_225_centos mysql-5.5.45]# source /etc/profile
[root@VM_31_225_centos mysql-5.5.45]# chown -R mysql.mysql /usr/local/mysql/
[root@VM_31_225_centos mysql-5.5.45]# 
[root@VM_31_225_centos mysql-5.5.45]# 
复制配置文件及启动脚本
root@VM_31_225_centos mysql-5.5.45]# cd /usr/local/mysql/support-files/
[root@VM_31_225_centos support-files]# ls my-*
[root@VM_31_225_centos support-files]# cp my-huge.cnf /etc/my.cnf 
cp: overwrite `/etc/my.cnf'? y
[root@VM_31_225_centos support-files]# 

[root@VM_31_225_centos support-files]# cp mysql.server /etc/init.d/mysqld


初始化数据库

[root@VM_31_225_centos support-files]# sh /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK
...
[root@VM_31_225_centos support-files]#
启动MySQL
[root@VM_31_225_centos support-files]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS! 
[root@VM_31_225_centos support-files]# 

[root@VM_31_225_centos support-files]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 17115 mysql 11u IPv4 52461 0t0 TCP *:mysql (LISTEN)
[root@VM_31_225_centos support-files]#


修改 root 密码

[root@VM_31_225_centos support-files]# mysqladmin -uroot password 'flyym'
好了,登陆试一下。
[root@VM_31_225_centos support-files]# mysql -uroot -pflyym
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.45-log Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.01 sec)

mysql> \q
Bye
[root@VM_31_225_centos support-files]#

检查mysql数据库是否存在坏表

此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表,适用于RHEL/Centos系列

 

15171459_KxFV

#!/bin/bash
#此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表
#变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数
#变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称
 
echo -e "此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\n\n"
pass=123456
name=root
 
read -p "输入mysql存储路径: "  choose
data_path=$choose
unset choose
 
read -p "请输入mysql命令路径: " mysql_version
#标准输入、标准输出、标准错误输出的文件标示符 由 0、1、2标识 
read -p "请选择是检查服务器上所有数据库还是指定的数据库 1:检查全部数据库 2:只检查指定数据库: " choose
if [ $choose == 1 ]; then
  cd $data_path
  for directory_list in $(ls)
    do
      if [ -d $directory_list ];then
          if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then
              cd ${directory_list}
              echo "当前检查数据库为:"${directory_list}
              for file_list in $(ls *.frm)
              do
                _file_name=${file_list%.frm}
                echo -e "\n" >> /tmp/check_table_all.log
                ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 2>&1 >> /tmp/check_table_all.log 
              done
              cd ..
          fi
      fi
  done
             cat /tmp/check_table_all.log | grep "Table is marked as crashed" > /tmp/check_table_repair.log
             repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log `
             echo -e "所有数据库用有${repair_count_all}张表需要修复!"
             more  /tmp/check_table_repair.log
else
  read -p "请输入要检查的数据库名称: " db_name
  cd ${data_path}/${db_name}
  for file_list in $(ls *.frm)
    do
      _file_name=${file_list%.frm}
      echo -e "\n" >> /tmp/check_${db_name}.log
      ${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 2>&1 >> /tmp/check_${db_name}.log
    done
    cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" > /tmp/check_${db_name}_Repair.log    
    repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log`
    echo -e "${db_name}中共有${repair_count}个表需要修复!\n "
    more /tmp/check_${db_name}_Repair.log                                 
fi

转自开源中国备用之。