业界流传一句话:没有做过运维的程序员不是好架构师。
不知是真是假。
对于 MySQL 数据库作为各个业务系统的存储介质,在系统中承担着非常重要的职责,如果数据库崩了,那么对于读和写数据库的操作都会受到影响。如果不能迅速恢复,对业务的影响是非常大的。之前 B 站不是出过一次事故么,2 小时才恢复过来,详细可以看之前写的文章。
[B 站崩了,总结下「高可用」和「异地多活」]
上次折腾完 ELK 日志检索平台后,开发环境可以正常查询日志了。最近在做系统高可用相关的工作,这次我来分享下 MySQL 双主 + Keepalived 的高可用落地和踩坑之路。
[一文带你搭建一套 ELK Stack 日志平台]
对于 MySQL 的高可用,主要分为两步,配置 MySQL 主主模式和 keepalived 软件。拓扑图如下所示:
两个数据库分别部署在两台服务器上,相互同步数据,但是只有一个提供给外部访问,当一个宕机后,另外一个可以继续提供服务,在没有 keepalived 软件的帮助下,只能手动切换
检测和重启的原理如下所示:
需要配置的内容如下:
对于 MySQL 的主主架构,其实原理就是两台服务器互为主从,双向复制。而复制的原理如下:
主从复制主要有以下流程:
大白话就是:
从库会生成两个线程,一个 I/O 线程,一个 SQL 线程;
I/O 线程会去请求主库的 binlog,并将得到的 binlog 写到本地的 relay-log (中继日志)文件中;
主库会生成一个 dump 线程,用来给从库 I/O 线程传 binlog;
SQL 线程,会读取 relay log 文件中的日志,并解析成 SQL 语句逐一执行;
接下来我们先把 MySQL 的基础环境在两台 Ubuntu 服务器上搭建好,后续操作都是基于这个来做的。
作为演示,我在本机启动了两台 Ubuntu 虚拟机,安装有 docker。因为我们的测试和生产环境是用 Docker 跑的,所以我将环境的镜像打包后,还原到我的虚拟机上面。
保存测试环境的 mysql 镜像
sudo docker save -o mysql.tar hcr:5000/hschub/hscmysql:0.0.2
sudo chmod 777 mysql.tar
两台机器导入镜像
sudo docker load -i mysql.tar
启动容器,需要注意的是需要映射本地文件夹。
sudo docker run -p 3306:3306 --name mysql \
-v /home/hss/mysql/data:/var/lib/mysql \
-v /home/hss/mysql/etc/mysql:/etc/mysql \
-e MYSQL_ROOT_PASSWORD='123456' \
-d 46b
-v 代表映射的文件夹,-d 表示后台运行,46b 代表镜像 id。
进入容器,连接 mysql,node1的mysql 密码是 123456,node2 是 123456
# 查询容器 id
docker ps
# 进入 mysql 容器
docker exec -it <容器 id> /bin/bash
# 连接 mysql
mysql -u root -p
接下来我们配置 MySQL 的主从架构,需要注意的是后续搭建的主主架构是基于主从架构来的,区别就是修改了一部分配置。
拓扑结构:
修改 /home/hss/mysql/etc/mysql/my.cnf 文件
server_id = 11
log_bin = /var/lib/mysql/log/mysql-bin
binlog-ignore-db=mysql
binlog_format= mixed
sync_binlog=100
log_slave_updates = 1
binlog_cache_size=32m
max_binlog_cache_size=64m
max_binlog_size=512m
relay_log = /var/lib/mysql/log/relay-bin
relay_log_index = /var/lib/mysql/log/relay-bin.index
master_info_repository=TABLE
relay-log-info-repository=TABLE
relay-log-recovery
创建 /home/hss/mysql/data/log/mysql-bin 文件夹
创建 /home/hss/mysql/data/log/relay-bin 文件夹
给两个文件夹加上 777 权限,然后重启 MySQL 容器。
和主节点配置类似,需要修改 server_id = 12
CREATE USER 'vagrant'@'192.168.56.12' IDENTIFIED BY 'vagrant';
ALTER USER 'vagrant'@'192.168.56.12' IDENTIFIED WITH mysql_native_password BY 'vagrant';
GRANT REPLICATION SLAVE ON *.* TO 'vagrant'@'192.168.56.12';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
记住 File 和 Position,后面会用到。这里 File = mysql-bin.000008,Position = 1020。
cd /var/lib/mysql
mkdir backup
mysqldump -uroot -P3306 --all-databases --triggers --routines --events > /var/lib/mysql/backup/all_databases.sql
查看挂载目录下是否有生成 all_databases.sql 文件,如下图所示:
UNLOCK TABLES
mysql -uroot -p -hlocalhost -P3306 < /var/lib/mysql/backup/all_databases.sql
在 MySQL 命令行窗口中执行以下命令设置同步信息。这里就是配置主数据库的 IP 地址、Port、用户名、密码,二进制文件名,偏移量。
CHANGE MASTER TO MASTER_HOST='192.168.56.11',
MASTER_PORT=3306,
MASTER_USER='vagrant',
MASTER_PASSWORD='vagrant',
MASTER_LOG_FILE='mysql-bin.000008',
MASTER_LOG_POS=1020;
在 MySQL 命令行窗口中执行以下命令启动从数据库的复制线程。
START salve;
SHOW slave status \G
如果 Slave_IO_Running 和 Slave_SQL_Running 显示 Yes,就表示启动同步成功。如下图所示:
在主库上执行以下命令显示当前连接过来的从库线程。
SHOW PROCESSLIST
如下所示,Slave has read all relay log; wating for more updates,说明从库已经同步完了。
使用上面的两个命令,我们可以判断当前的复制情况。
下面验证下主从节点之间是否能正常同步数据。
主节点创建 testdb 数据库和 member 表。
刷新下从节点,发现从节点自动创建了 member 表。如下图所示。
然后在主节点插入一条数据,刷新从节点后,发现从节点也自动创建了一条数据。
配置主主架构就是在主从架构中交换下配置信息。步骤如下:
STOP slave
CREATE USER 'vagrant'@'192.168.56.11' IDENTIFIED BY 'vagrant';
ALTER USER 'vagrant'@'192.168.56.11' IDENTIFIED WITH mysql_native_password BY 'vagrant';
GRANT REPLICATION SLAVE ON *.* TO 'vagrant'@'192.168.56.11';
FLUSH PRIVILEGES;
SHOW MASTER STATUS
start slave
CHANGE MASTER TO MASTER_HOST='192.168.56.12',
MASTER_PORT=3306,
MASTER_USER='vagrant',
MASTER_PASSWORD='vagrant',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=2453;
START salve
SHOW slave status \G
node2 的 member 表增加一条数据 (2,zzz),node1 上同步成功
node 1 的 member 表增加一条数据(3,aaa),node2 上同步成功
Keepalived 软件在主主架构中,可以配置成两种应用场景:
这里我配置成第二种功能场景,保障 MySQL 服务的高可用。另外可以配置 MySQL 服务异常时,发送邮件给运维或开发人员,由他们检查服务器的状态。
Keepalived 提供了一个虚拟 IP (简称 VIP),对外提供访问。当客户端连接这个虚拟 IP 后,只会访问其中一个 MySQL。MySQL 节点故障后,keepalived 执行脚本进行重启,如果重启失败,脚本自动停掉 keepalived,备用节点自动切换为主节点。
keepalived 检测和重启的流程图如下:
安装依赖、获取 keepalived 安装包、解压安装包、删除安装包。
# 安装依赖
sudo apt-get install -y libssl-dev
sudo apt-get install -y openssl
sudo apt-get install -y libpopt-dev
sudo apt-get install -y libnl-dev
sudo apt-get install -y libnl-3-dev
sudo apt-get install -y libnl-genl-3.dev
sudo apt-get install daemon
sudo apt-get install libc-dev
sudo apt-get install libnfnetlink-dev
sudo apt-get install gcc
# 获取 keepalived 安装包
cd /usr/local
sudo su
sudo wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
# 解压安装包
sudo tar -zxvf keepalived-2.2.2.tar.gz
# 删除安装包
mv keepalived-2.2.2 keepalived
配置 keepalived 软件
cd keepalived
./configure --prefix=/usr/local/keepalived --disable-dependency-tracking
执行结果如下所示:
编译 keepalived 软件
sudo make && make install
执行结果如下所示:
对于 Ubuntu ,需要做一点特别的改动,创建链接
mkdir -p /etc/rc.d/init.d
ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions
拷贝配置文件
sudo mkdir /etc/sysconfig
sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
sudo cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/
sudo cp /usr/local/keepalived/sbin/keepalived /sbin/
sudo mkdir /etc/keepalived
sudo cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
修改配置文件 /etc/keepalived/keepalived.conf
daemon keepalived ${KEEPALIVED_OPTIONS}
改为
daemon -- keepalived ${KEEPALIVED_OPTIONS}
先用 ifconfig 查看当前的网卡,比如我的服务器上是 enp0s8。
ip addr del 192.168.56.88 dev enp0s8:1
ifconfig enp0s8:1 192.168.56.88 broadcast 192.168.56.255 netmask 255.255.255.0 up
route add -host 192.168.56.88 dev enp0s8:1
将命令写到 /usr/local/script/vip.sh文件中。最好将 /usr/local/script/vip.sh文件添加到服务器的开机启动项中,将 Keepalived 服务设置为开机自启动(未写)。
备份配置文件
sudo mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
修改配置文件
sudo vim /etc/keepalived/keepalived.conf
配置文件的内容如下:
global_defs {
router_id MYSQL_HA #当前节点名
}
vrrp_script restart_mysql {
script "/usr/local/keepalived/restart_mysql.sh" #重启 mysql 容器
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP #两台配置节点均为BACKUP
interface enp0s8 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 101 #节点的优先级,另一台优先级改低一点
advert_int 1 #组播信息发送间隔,两个节点设置必须一样
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 123456
}
track_script {
restart_mysql #检测 mysql 状态,如果失败,则重启 mysql 容器
}
virtual_ipaddress { #指定虚拟IP,两个节点设置必须一样
192.168.56.88
}
}
virtual_server 192.168.56.88 3306 { #linux虚拟服务器(LVS)配置
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr #LVS调度算法,rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式 ,NAT|DR|TUN
persistence_timeout 60 #会话保持时间
protocol TCP #使用的协议是TCP还是UDP
real_server 192.168.56.11 3306 {
weight 3 #权重
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
编写异常处理脚本
sudo vim /usr/local/keepalived/restart_mysql.sh
内容如下,
#!/bin/bash
# 定义变量,重启 mysql 容器
START_MYSQL="docker restart mysql"
# 定义变量,停止 mysql 容器
STOP_MYSQL="docker stop mysql"
# 定义变量,日志文件路径
LOG_FILE="/usr/local/keepalived/logs/mysql-check.log"
# 定义变量,检查 mysql 服务是否正常的命令
HAPS=`ps -C mysqld --no-header |wc -l`
# 打印当前时间到日志文件
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
# 打印提示信息到日志文件
echo "check mysql status" >> $LOG_FILE
# 检查数据库状态,如何返回 0,则重启 mysql 容器,然后休眠 3s 后,再次检测 mysql 状态,如果还是返回 0,则停止 keepalived。
if [ $HAPS -eq 0 ];then
echo $START_MYSQL >> $LOG_FILE
$START_MYSQL >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C mysqld --no-header |wc -l` -eq 0 ];then
echo "start mysql failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi
给脚本分配权限
sudo chmod +x /usr/local/keepalived/restart_mysql.sh
创建 logs 文件夹,给 logs 文件夹分配权限
sudo mkdir /usr/local/keepalived/logs
sudo chmod +x /usr/local/keepalived/logs -r
重新加载配置文件
sudo systemctl daemon-reload
启动 node2 节点:
sudo pkill keepalived
sudo systemctl start keepalived
sudo systemctl status keepalived
启动 node1 节点:
pkilll keepalived
sudo systemctl status keepalived
我们可以通过这个命令查看 keepalived 进程
ps -ef | grep keepalived
查看日志
sudo cat /var/log/syslog
停止 node2 上的 mysql 容器
docker stop 8cc
查看 keepalived 状态,提示移除了 mysql 服务。
因为 keepalived 会每 2s 检查一次 MySQL 的状态,发现 MySQL 异常后,就会重启 mysql 容器。所以过几秒后,重新查看容器状态,会看到 mysql 容器重新启动了。
docker ps
查看 keepalived 状态,执行 restart_mysql 成功
查看执行日志
问题:每 2s 会打印一次,文件可能会很大。需要执行定期删除。
验证下当 MySQL 重启失败后,keepalived 自动停止后,客户端连接的 MySQL 是否会自动切到另外一个 MySQL 节点上。
首先用 mysql 客户端工具 navicat 连接虚拟 ip 地址,账号和密码就是 node 1 和 node2 的 mysql 账号密码(root/123456)
可以连接上,然后执行以下命令,查看当前虚拟 ip 连接的是哪个数据库
SHOW VARIABLES LIKE '%hostname%'
可以看到连接的是 node2 的容器的 id,说明 keepalived 已经通过虚拟 ip 连接到 node2 的 mysql 了,是正常工作的,node2 现在是作为主节点,node1 作为备用节点。
由于本地环境重新启动 MySQL 都是成功的,不会停掉 keepalived 服务。出于演示目的,我就直接停掉 keepalived 服务。
pkill keepalived
执行下面这个命令可以查看 keepalived 进程,发现已经没有了。(控制台显示的 grep --color=auto keepalived 表示是查找命令)
ps -ef | grep keepalived
重新查询客户端的连接信息,发现已经切换到 92b (node1)机器上的 mysql 了。
SHOW VARIABLES LIKE '%hostname%'
再次查看 node1 上 keepalived 上的状态,再发送信息给
sudo systemctl status keepalived
密码不正确,设置跳过密码验证
apt-get update
apt install vim
修改 mysql 配置文件
vim /etc/mysql/my.cnf
添加一行配置,跳过 mysql 密码验证
skip-grant-tables
重启容器
docker restart 9e6
重新计入 mysql 容器,连接 mysql,不需要密码就可以连接上 mysql。
mysql
修改登录密码
update mysql.user set authentication_string=PASSWORD('123456') where User='root';
重启容器
cd /home/hss/mysql/etc
sudo chmod 777 mysql -R
拷贝 mysql 文件夹
sudo chmod 777 /home/hss/mysql/data -R
sudo apt-get install -y libnl-dev libnl-3-dev libnl-genl-3.dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'libnl-genl-3-dev' for regex 'libnl-genl-3.dev'
Package libnl-dev is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'libnl-dev' has no installation candidate
解决方案:更新包
sudo apt-get -y update
Err:15 https://download.docker.com/linux/ubuntu bionic Release Could not wait for server fd - select (11: Resource temporarily unavailable) [IP: 198.18.0.39 443] Reading package lists... Done E: The repository 'https://download.docker.com/linux/ubuntu bionic Release' no longer has a Release file. N: Updating from such a repository can't be done securely, and is therefore disabled by default. N: See apt-secure(8) manpage for repository creation and user configuration details.
解决方案:
修改配置文件
sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup
sudo vim /etc/apt/sources.list
配置内容如下:
deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
执行更新
sudo apt-get update
apt-get install libnl-dev
The following packages have unmet dependencies:
libnl-3-dev : Depends: libnl-3-200 (= 3.2.21-1ubuntu4.1) but 3.2.29-0ubuntu3 is to be installed
Conflicts: libnl-dev but 1.1-8ubuntu1 is to be installed
libnl-genl-3-dev : Depends: libnl-genl-3-200 (= 3.2.21-1ubuntu4.1) but 3.2.29-0ubuntu3 is to be installed
E: Unable to correct problems, you have held broken packages.
解决方案:
按照这个报错信息来进行降级,等号后面就是提示信息里括号的版本信息。
sudo apt-get install libnl-3-200=3.2.21-1ubuntu4.1
sudo apt-get install libnl-genl-3-200=3.2.21-1ubuntu4.1
root@node1:/usr/local/keepalived/etc/keepalived# service keepalived restart
Failed to restart keepalived.service: Unit keepalived.service is masked.
root@node1:/usr/local/keepalived/etc/keepalived# systemctl status keepalived.service
● keepalived.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
Condition: start condition failed at Wed 2022-05-11 02:40:46 UTC; 1 day 3h ago
解决方案:
systemctl unmask sshd
再次启动,提示另外一个错误。
解决方案,因为 ubuntu 没有这个命令 /etc/rc.d/init.d/functions,所以需要添加一个命令链接
mkdir -p /etc/rc.d/init.d
ln -s /lib/lsb/init-functions /etc/rc.d/init.d/functions
切换回 ubuntu 官方源
sudo mv /etc/apt/sources.list /etc/apt/sources.list.backup2
sudo mv /etc/apt/sources.list.backup /etc/apt/sources.list
sudo apt-get update
sudo apt-get install gcc
WARNING - default user 'keepalived_script' for script execution does not exist - please create.
解决方案:
配置文件的 global_defs 配置里面增加 script_user root
global_defs {
script_user rot
}
May 16 03:50:54 node1 Keepalived_vrrp[19855]: WARNING - script '/usr/local/keepalived/restart_mysql.sh' is not executable for uid:gid 0:0 - disabling.
May 16 03:50:54 node1 Keepalived_vrrp[19855]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
给脚本添加权限。
参考资料:
https://weread.qq.com/web/reader/bd032100721bc56bbd056ff
https://weread.qq.com/web/reader/85a329405d039885a68ca85
https://blog.csdn.net/Sebastien23/article/details/114260591
https://www.cnblogs.com/zhangxingeng/p/10595058.html
https://blog.csdn.net/u012599988/article/details/82152224
https://blog.csdn.net/lupengfei1009/article/details/86514445
https://blog.csdn.net/temotemo/article/details/79445694
https://blog.csdn.net/qq_38491310/article/details/86510666
- END -
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/c0PGIXDRf47-eK7Fnar4rw
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。